2016-06-08 2 views
0

Моя регулярное выражение: input_data.txtPython регулярное выражение все между скобкой на нескольких строках

TMP_REGEXP = r'_\(\s*(.*)\s*\)\s*$' 
TMP_PATTERN = re.compile(TMP_REGEXP, re.MULTILINE) 

Файл:

print _(
    'Test #A' 
    )    

print _(
    '''Test #B''' 
    '''Test #C''' 
) 

Я бегу это так:

with codecs.open('input_data.txt', encoding='utf-8') as flp: 
    content = flp.read() 

extracted = re.findall(TMP_PATTERN, content) 

Я хочу достичь: - взять все символы, которые следуют '_ (' - конец чтения ch атракторы, если есть «)», за которыми следуют ноль или более пробелов и конец строки

Что интересного «Тест №А» работает как шарм «Тест #B» пропущен.

+0

Что такое вложенные парнеры? Вы будете взволнованы. – erip

+2

Дубликат http://stackoverflow.com/questions/587345/python-regular-expression-matching-a-multiline-block-of-text –

ответ

2

Это работает для меня:

m = re.findall(r'(?s)_\((.*?)\)', content) 

(?s) ищет что-либо (в том числе переводы строк).

_\( соответствует вашему желаемому старту.

(.*?) что-то ищет.

\) соответствует вашему концу.

Возможно, вам понадобится $ в конце и сделать некоторые зачистки.

>>> content = """ 
... print _(
...  'Test #A' 
... )    
... 
... print _(
...  '''Test #B''' 
...  '''Test #C''' 
...) 
... """ 
>>> import re 
>>> m = re.findall(r'(?s)_\((.*?)\)', content) 
>>> for i, match in enumerate(m, 1): 
...  print("Match {0}: {1}".format(i, match)) 
... 
Match 1: 
    'Test #A' 

Match 2: 
    '''Test #B''' 
    '''Test #C''' 

>>> 
+0

Существует один поворот, чтобы понять, что, если есть Тест #B (' a ',' b ') \ n Тест #C, поэтому я хочу закончить чтение, когда есть), а затем ничего. Но в целом я на шаг ближе, спасибо. – Drachenfels

+0

@Drachenfels Тогда вы не можете сделать это с помощью регулярного выражения. Это не обычный язык, поэтому регулярное выражение не может соответствовать этому языку. – erip

+1

Это __not__ lookbehind. –

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