2010-02-18 4 views
2

Учитывая эту строку:Как решить это с помощью регулярного выражения?

 
\n 
\n 
text1\n 
\ttext2\n 
    Message: 1st message\n 
some more text\n 
\n 
\n 
    Message: 2dn message\n\n 
\t\t 
Message: 3rd message\n 
text3\n 

Я хочу, чтобы извлечь сообщения из многострочной строки (лексема «Сообщение:»). Что регулярное выражение следует использовать, чтобы захватить эти 3 группы:

  • группа 1: '1-сообщение'
  • Группа 2: '2dn сообщение'
  • группа 3: '3-е сообщение'

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

Моя программа в Python 2.6, но я предполагаю, что это не делает большой разницы, какой язык я использую ...

+0

вы не заботиться о 'некоторых более Text' и' Text' частей, которые находятся на следующих строках? разместите ваше регулярное выражение – SilentGhost

+0

правильно; Я просто хочу, чтобы содержимое было в той же строке, что и «Сообщение»: – Sylvain

ответ

9
>>> re.findall('Message: (.+?)$', s, re.M) 
['1st message', '2dn message', '3rd message'] 

re.M flag gives special meaning to ^ and $:

Если указан, то шаблон символов '^' соответствует началу строки и в начале каждой строки (сразу после каждой новой строки); и символ шаблона '$' совпадает в конце строки и в конце каждой строки (непосредственно перед каждой новой строкой). По умолчанию '^' соответствует только в начале строки и '$' только в конце строки и непосредственно перед новой строкой (если есть) в конце строки.

(.+?)$ соответствует хотя бы одному символу до ближайшего конца строкового символа.

редактировать: действительно простая версия тоже будет работать:

>>> re.findall('Message: (.+)', s) 
['1st message', '2dn message', '3rd message'] 

Я удивлен, что он не был в списке тех многочисленных вещей, которые вы пытались :)

+0

Отлично! не могли бы вы объяснить, как это работает? – Sylvain

+2

Если это то, что он хочет, почему бы не просто re.findall ('Message: (. +)', S)? –

+0

Я совершенно не знаком с регулярным выражением, и я был на неправильном пути. Сначала я пытался использовать 'match', а не' findall' (я не уверен, что каждый из них делает, но я буду читать об этом). И по какой-то причине я думал, что мне нужно использовать подстановочные знаки в начале выражения. – Sylvain

0

@ OP, вам не требуется регулярное выражение. Предполагая, что вы не заботитесь о линиях после "Message:",

for line in mystring.split("\n") 
    if "Message:" in line: 
     print "found: ",line 
Смежные вопросы