2008-09-22 6 views
3

경쟁이 아니라, 대신 특정 정규 표현식이 하나에서 작동하지만 다른 것으로부터 작동하지 않는 이유를 찾으려고 노력합니다. 내 정규식이고 나는 그것을 일치 PHP를 사용하여, 나는 아무것도 얻을 파이썬 정규식을 사용하여Python Regex 대 PHP Regex

127.255.0.0 

에서 실행하기 위해 노력하고있어

(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]?) 

, 아래 단지 넣다 (내가 만드는 중이라서 두 통화하다 그것은 그와 관련이 있습니다.) 본질적으로 PHP에서 작동하지만 파이썬에서는 작동하지 않는 이유를 알아 내려고 노력 중입니다. 해결 방법을 찾을 수

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


, 그것이 내가 결과를 통해 반복 된 방법 때문이 정규식 그룹으로 설정 한 후이 등 등 같은 방식으로 인쇄하고 싶지 않았다 도와 주셔서 감사합니다. 정말로 감사합니다.

+0

정규식을 수행 할 때 좋은 도구를 사용하면 항상 편리합니다. 이 2 명의 온라인 테스터는 PHP regex (http://regex.larsolavtorvik.com/)와 Python regex (http://ksamuel.pythonanywhere.com)를 입력하여 비교할 수 있도록해야합니다. –

답변

7

나를 위해 작동합니다. 뭔가 잘못하고 있어야합니다.

>>> 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') 

정규식 원시 문자열을 사용하여 탈출하는 것을 잊지 마세요 : 정규 표현식 여기에 일치하는 Regex Howto

1

에 명시된 바와 같이 r'regex_here'을 당신이 잘못하고있는 것을 아무 생각없는 :

>>> 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> 

preg_matchre.match이 아니라 파이썬에서 re.search으로 변환됩니다. re.match은 고정되어 있기 때문에 렉싱에 유용합니다.

1

PHP은 3 가지 다른 종류의 정규식을 사용하지만 파이썬은 하나만 사용합니다. 나는 파이썬으로 코드를 작성하지 않으므로 REGEX를 사용하는 방법에 대한 전문가의 주장을하지 않습니다. O'Reilly Mastering Regular Expressions은 대다수의 작품으로 훌륭한 책입니다.

4

10 진수 범위 유효성 검사에 정규식을 사용하는 것이 반드시이 문제의 정답 일 수는 없음을 제안합니다. 이것은 훨씬 더 읽기 쉽습니다 :

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 
2

자세한 내용이 없으면, 나는 그것이 어떤 종류의 이스케이프 인용입니다. PHP와 Python의 RegEx 객체 모두 문자열을 인수로 사용합니다. 이 문자열은 RegEx 엔진으로 전달되기 전에 언어에 의해 이스케이프됩니다.

정규 표현식으로 작업 할 때 항상 파이썬의 "원시"문자열 형식을 사용합니다. 그것은 "backslashes are not handled in any special way"

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]?)' 
3

당신이 , 당신이해야 의미하지 않는다 정규식으로 그것을 할 수 있다고해서 확인합니다. 다음과 같은 지침을 작성하는 것이 훨씬 더 낫습니다. 마침표를 문자열로 분리하고 각 그룹이 숫자이고 특정 범위의 숫자 범위 내에 있는지 확인하십시오.

정규식을 사용하려면 그렉의 정규식과 같이 IP 주소와 모양이 같은지 확인하십시오.