Регулярное выражение не соответствует тому, что, я думаю, должно - PullRequest
1 голос
/ 07 июля 2010

В python я собираю шаблон регулярного выражения следующим образом:

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)].*')

Это соответствует первым 2 просто отлично.

Аналогично, если я напишу:

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

Это соответствуетпоследние 2.

Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 07 июля 2010

Мой regex-fu не основан на Python, но если предположить, что он чем-то похож на стандарт, я думаю, вы неправильно понимаете использование '[' и ']'. Они представляют класс символов , и кажется, что вам нужно чередование .

Попробуйте заменить ваши конструкции "[(word1) (word2)]" на "(word1 | word2)".

РЕДАКТИРОВАТЬ: Только что проверил документы Python (здесь: http://docs.python.org/library/re.html), и я не вижу каких-либо существенных различий между регулярным выражением Python и тем, к чему я привык (т.е. ничего, что должно повлиять точность этого ответа.)

2 голосов
/ 07 июля 2010

Это в основном потому, что вы совершенно не поняли, как «определение альтернатив» работает в регулярных выражениях:

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

Ваша попытка создает классы персонажей. Каждый символ в классе символов стоит сам по себе, а сам класс действительно соответствует только одному символу из списка разрешенных. Итак, ваша попытка:

[(in)(out)]

действительно совпадает с

[intou(())]

, что фактически совпадает с [intou()], потому что повторяющиеся символы в классе символов игнорируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...