PHP Regex vs Python Regex

6 Cevap php

Bir yarışma değil hayır, belli bir regex birinde çalışıyor ama diğer neden bulmaya çalışıyor yerine benim.

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

Bu benim Regex ve ben bunu çalıştırmak için çalışıyorum

127.255.0.0

Ben PHP kullanarak, hiçbir şey elde piton regex kullanarak ben (o ile ilgili bir şey sadece örtmek) yapma am iki aramalar aşağıda, bu maç. Esasen ben Python değil PHP çalışıyor ama neden çalışmak için çalışıyorum.

re.findall(regex, string)
preg_match_all($regex, $string, $matches);


Solution found, it was due to the way that I was iterating through the results, this regex turned them into groups and then it didn't want to print them out in the same way etc etc. Thank you all for your help, it's really appreciated :)

6 Cevap

Bu benim için çalışıyor. Sen yanlış bir şey yapıyor olması gerekir.

>>> re.match(r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)', '127.255.0.0').groups()
('127', '255', '0', '0')

Ham dizelerini kullanarak regex kaçmak için unutma: r'regex_here' Regex Howto belirtildiği gibi

Ben ondalık aralığı doğrulama için bir regex kullanarak mutlaka bu sorunun doğru cevabı olmadığını öneririm. Bu çok daha okunabilir:

def valid_ip(s):
    m = re.match(r"(\d+)\.(\d+)\.(\d+)\.(\d+)$", s)
    if m is None:
        return False
    parts = [int(m.group(1+x)) for x in range(4)]
    if max(parts) > 255:
        return False
    return True

Eğer can regex bunu, sırf gerektiği anlamına gelmez. Her grup sayısal ve sayılar belirli bir aralık içinde olduğundan emin olun dönemde dize bölmek: Bu gibi talimatlar yazmak için çok daha iyi olurdu.

Bir regex kullanmak istiyorsanız, sadece bu tür Greg'in regex gibi, bir IP adresi "benziyor" doğrulayın.

Fazla ayrıntıya girmeden, ben bazı tür alıntı öncelemeli tahmin ediyorum. PHP ve Python regex nesneleri Hem argümanlar olarak dizeleri alır. Bu dizelerin RegEx motorun üzerine geçirilmeden önce languge tarafından kaçtı edilecektir.

Düzenli ifadeler ile çalışırken hep Python "ham" dize biçimini kullanarak. O "backslashes are not handled in any special way" sağlamak

r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'

Düzenli ifade, burada yanlış yapıyorsun hiçbir fikrim maçlar:

>>> import re
>>> x = re.compile(r'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|'
... r'2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9]'
... r'[0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)')
>>> x.match("127.0.0.1")
<_sre.SRE_Match object at 0x5a8860>
>>> x.match("127.255.0.1")
<_sre.SRE_Match object at 0x5a8910>
>>> x.match("127.255.0.0")
<_sre.SRE_Match object at 0x5a8860>

Bu preg_match re.search Python olup re.match çevirir lütfen unutmayın. Bu, tutturuldukları için re.match basamaktan için yararlı içindir.

Piton tek kullanır iken PHP, regex 3 farklı tatlar kullanır. Python kod yok, bu yüzden regex nasıl kullandığı ile ilgili hiçbir uzman iddiada. Onların eserlerinin çoğu gibi O'Reilly Mastering Regular Expressions, harika bir kitap.