Регулярное выражение не соответствует тому, что, я думаю, должно

1

В 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 ответа

2
Лучший ответ

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

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

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

[(in)(out)]

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

[intou(())]

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

3

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

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

EDIT: Просто проверил документы Python (здесь: http://docs.python.org/library/re.html), и я не вижу любые существенные различия между регулярным выражением Python и тем, к чему я привык (т.е. ничего, что должно повлиять на точность этого ответа.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню