Получить повторяющийся контент с помощью регулярных выражений - PullRequest
0 голосов
/ 06 июня 2018

У меня есть контент в формате:

text = """Pos no
...
... 25/gm
The Text to be 
...
excluded
Pos no
...
... 46 kg
The Text to be 
...
excluded
Pos no
...
... 46 xunit
End of My Text

Где, Pos no... 25/gm - Это своего рода табличная структура, из которой мне нужно извлечь значения.

The Text to be ... excluded - Он имеет постоянное начало (скажем, The Text to be), но не имеет определенного конца, т. Е. excluded может отсутствовать.

End of My Text - Этот текст всегда будет присутствовать.

Iхочу список только с табличным содержимым, т.е.

["Pos no
...
... 25/gm",
"Pos no
...
... 46 kg",
"Pos no
...
... 46 xunit"]

Вот моя попытка, но выборочный список не получается:

re.findall(r'(Pos no .+?)(?: |The Text to be|End of My Text)', text, re.DOTALL | re.M)

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете использовать

re.findall(r'(?sm)(Pos no\r?\n.+?)[\r\n]+(?:The Text to be|End of My Text)', text)

См. Демонстрационную версию Python

Обратите внимание, что Pos no не имеет пробела, но ваш шаблон требовал его.Кроме того, сопоставление правого контекста только в начале строки сделает сопоставление более безопасным.

Детали шаблона

  • (?sm) -re.DOTALL и re.MULTILINE встроенные модификаторы (для более короткого кода)
  • (Pos no\r?\n.+?) - Группа 1 (что возвращается re.findall):
    • Pos no - буквенная подстрока
    • \r?\n - разрыв строки CRLF или LF
    • .+? - любые 1+ символов, как можно меньше, вплоть до самого левого вхождения последующих подшаблонов
  • [\r\n]+ - 1+ символов разрыва строки
  • (?:The Text to be|End of My Text) - любая из двух подстрок, The Text to be или End of My Text.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...