2013-12-17 4 views
3

У меня возникла странная проблема; Надеюсь, никто не задавал этот вопрос до Мне нужно совместить два регулярных выражения, содержащие "(" ")".Python re.match не соответствует одному и тому же регулярному выражению

Здесь пока вид тестов я сделал, чтобы понять, почему это не работает:

>>> import re 
>>> re.match("a","a") 
<_sre.SRE_Match object at 0xb7467218> 

>>> re.match(re.escape("a"),re.escape("a")) 
<_sre.SRE_Match object at 0xb7467410> 

>>> re.escape("a(b)") 
'a\\(b\\)' 

>>> re.match(re.escape("a(b)"),re.escape("a(b)")) 

=> Ни один матч

Может кто-нибудь объяснить мне, почему регулярное выражение не совпадает с себя?

Большого спасибо

+0

Regexes * do not * обычно соответствуют самим себе. Это не «найти эту строку»; regexes - это миниатюрный декларативный язык программирования. – user2357112

ответ

6

Вы избежали специальных символов, так что ваше регулярное выражение будет соответствовать строке "a(b)", а не строка
'a\(b\)', которая является результатом re.escape('a(b)').

1

Первый аргумент - это объект шаблона, второй - фактическая строка, которую вы сопоставляете. Вы не должны избегать самой строки. Помните, что re.escape вытесняет специальные символы в regexp.

>>> help(re.match) 
Help on function match in module re: 

match(pattern, string, flags=0) 
    Try to apply the pattern at the start of the string, returning 
    a match object, or None if no match was found. 

>>> re.match(re.escape('a(b)'), 'a(b)') 
<_sre.SRE_Match object at 0x10119ad30> 
Смежные вопросы