Как решить эту проблему с помощью регулярных выражений? - PullRequest
2 голосов
/ 18 февраля 2010

Учитывая, что строка:

\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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 18 февраля 2010
Флаг
>>> re.findall('Message: (.+?)$', s, re.M)
['1st message', '2dn message', '3rd message']

re.M придает особое значение ^ и $:

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

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

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

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

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

0 голосов
/ 19 февраля 2010

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

for line in mystring.split("\n")
    if "Message:" in line:
         print "found: ",line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...