2010-07-07 5 views
1

컴파일하고있어한다 생각과 일치하지 않는 :정규 표현식은 내가, 내가 이렇게 같은 정규 표현식 패턴을 파이썬에서

rule_remark_pattern = re.compile('access-list shc-[(in)(out)] [(remark)(extended)].*') 
나는 다음 줄의 일치 기대

:

access-list shc-in remark C883101 Permit http from UPHC outside to Printers inside 
access-list shc-in extended permit tcp object-group UPHC-Group-Outside object-group PRINTER-Group-Inside object-group http-https 
access-list shc-out remark C890264 - Permit (UDP 123) from UPHC-Group-Inside to metronome.usc.edu 
access-list shc-out extended permit udp object-group UPHC-Group-Inside host 68.181.195.12 eq ntp 

불행히도 그 중 하나와 일치하지 않습니다. 그러나 정규 표현식을 다음과 같이 쓰는 경우 :

rule_remark_pattern = re.compile('access-list shc-in [(remark)(extended)].*') 

두 번째 정규식과 정확하게 일치합니다.

마찬가지로, 내가 쓰는 경우 :

rule_remark_pattern = re.compile('access-list shc-out [(remark)(extended)].*') 

그것은 지난 2

누구 여기에 무슨 일이 일어나고 있는지 일치?

답변

2

정규 표현식에서 작동 :

 
access-list shc-(in|out) (remark|extended).* 

귀하의 시도가 문자 클래스를 생성합니다. 문자 클래스의 모든 문자는 자체적으로 표시되며 클래스 자체는 실제로 허용 된 목록의 문자 하나만 일치시킵니다. 그래서 시도 :

[(in)(out)]

정말 문자 클래스에서 반복되는 문자는 무시되기 때문에 실제로 [intou()]과 동일

[intou(())]

과 동일합니다.

3

내 regex-fu는 Python 기반이 아니지만 표준과 비슷하다고 가정하면 '['와 ']'를 오해하고있는 것 같습니다. 그들은 문자 클래스을 나타내며 이 필요합니다.

"[(word1) (word2)]"구문을 "(word1 | word2)"로 바꾸어보세요.

편집 : 그냥 (여기 : http://docs.python.org/library/re.html) 파이썬 문서를 확인. (이 답변의 정확도에 영향을 미칠해야 즉, 아무것도) 내가 파이썬 regexen과 제가 사용 해요 사이에 어떤 관련 차이를 볼 수 없습니다 완전히 어떻게 "정의 대안을"잘못-이해하기 때문에 주로이다