2013-10-14 3 views
1

Я пытаюсь разделить шаблоны регулярных выражений на несколько строк, но, похоже, отображает только шаблон, указанный в последней строке. Ниже пример иллюстрирует проблему:python расщепление регулярных выражений на нескольких строках

>>> o = re.compile(r'\btext1\b\ 
... |\btext2\b\ 
... |\btext3\b') 
>>> print o.search(x) 
None 
>>> x 
'text1' 
>>> x = 'text3' 
>>> print o.search(x) 
<_sre.SRE_Match object at 0x025E4CD0> 
>>> x = 'text2' 
>>> print o.search(x) 
None 

Как я могу написать эту линию через несколько строк:

>>> o = re.compile(r'\btext1\b|\btext2\b|\btext3\b') 
+0

Проверить этот ответ [pythonic способ создания длинной многострочной строки]: http://stackoverflow.com/questions/10660435/pythonic-way-to-create-a-long-multi-line-string – Don

ответ

3

Использование re.VERBOSE (или re.X) флаг.

Или положил (?x) внутри обычного выражения.

>>> import re 
>>> o = re.compile(r''' 
... \btext1\b | 
... \btext2\b | 
... \btext3\b 
... ''', flags=re.VERBOSE) 
>>> o.search('text1') 
<_sre.SRE_Match object at 0x0000000001E58578> 
>>> o.search('text2') 
<_sre.SRE_Match object at 0x0000000002633370> 
>>> o.search('text3') 
<_sre.SRE_Match object at 0x0000000001E58578> 
>>> o.search('text4') 
>>> 
0

Если вы используете \ продолжать строку в конце строки в исходном коде, символ новой строки помещается будет частью этой строки.

Я предлагаю использовать одну из этих синтаксисов вместо:

o = re.compile(r'\btext1\b' 
       r'|\btext2\b' 
       r'|\btext3\b') 

или

o = re.compile(r'\btext1\b|\btext2\b|\btext3\b') 

или используют re.VERBOSE флаг как @falsetru предложил в своем ответе, чтобы иметь возможность вставлять пробельные символы (например, newlines), которые будут пропущены парсером шаблонов регулярных выражений при компиляции вашего шаблона.

Debugging намек: Вы можете вывести o.pattern:

print o.pattern 

, чтобы проверить шаблон скомпилированный регулярное выражение основано. Это показало бы вам проблему в вашем случае.

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