2013-08-15 2 views

ответ

1

Использование re.search не re.match, re.match Используется для совпадения в начале строки.

search() vs. match():

Python предлагает два различных примитивные операции, основанные на регулярных выражений: re.match() проверки на матч только в начала из строки, в то время как re.search() проверяет матч где-нибудь в строка (это то, что по умолчанию делает Perl).

6

Из документов на re.match:

Обратите внимание, что даже в режиме MULTILINE, re.match() будет соответствовать только в начале строки, а не в начале каждой строки.

Если вы хотите найти место в любом месте в строке, используйте вместо этого search() (см. Также search() vs. match()).

re.match() не находит соответствия нигде в строке, тогда как re.search() будет. Вместо этого вы захотите использовать re.search() (большую часть времени).

Наблюдайте:

>>> import re 
>>> line = "... ... constant0 [email protected]\r" 
>>> matchObj = re.match('constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I) 
>>> matchObj # None 
>>> matchObj = re.search('constant\d+\s+(\w+)\@(\w+)', line, re.M|re.I) 
>>> matchObj 
<_sre.SRE_Match object at 0x10ce84470> 
>>> print matchObj.group(0) 
constant0 [email protected] 
>>> print matchObj.group(1) 
username 
1

re.match соответствует только в начале строки. re.search соответствует где угодно. В соответствии с docs, не просто добавьте .* в начале re.match, используйте re.search, чтобы получить оптимизацию! (re.search делает быстрый цикл в c, чтобы проверять только части строки, соответствующие первому символу. Если он начинается с двусмысленного символа, он должен пройти весь путь до конца строки и обратного отсчета.)

И here является более мягким и (я думаю) вообще лучше знакомство с большинством функций регулярного выражения Python.

Смежные вопросы