Регулярное выражение, соответствующее многострочному блоку текста

Это будет работать:

>>> import re
>>> rx_sequence=re.compile(r"^(.+?)\n\n((?:[A-Z]+\n)+)",re.MULTILINE)
>>> rx_blanks=re.compile(r"\W+") # to remove blanks and newlines
>>> text="""Some varying text1
...
... AAABBBBBBCCCCCCDDDDDDD
... EEEEEEEFFFFFFFFGGGGGGG
... HHHHHHIIIIIJJJJJJJKKKK
...
... Some varying text 2
...
... LLLLLMMMMMMNNNNNNNOOOO
... PPPPPPPQQQQQQRRRRRRSSS
... TTTTTUUUUUVVVVVVWWWWWW
... """
>>> for match in rx_sequence.finditer(text):
...   title, sequence = match.groups()
...   title = title.strip()
...   sequence = rx_blanks.sub("",sequence)
...   print "Title:",title
...   print "Sequence:",sequence
...   print
...
Title: Some varying text1
Sequence: AAABBBBBBCCCCCCDDDDDDDEEEEEEEFFFFFFFFGGGGGGGHHHHHHIIIIIJJJJJJJKKKK

Title: Some varying text 2
Sequence: LLLLLMMMMMMNNNNNNNOOOOPPPPPPPQQQQQQRRRRRRSSSTTTTTUUUUUVVVVVVWWWWWW

Некоторые multiline пояснения к этому регулярному regular-expressions выражению могут быть полезны: ^(.+?)\n\n((?:[A-Z]+\n)+)

  • Первый символ (^) означает «начало с начала строки». Имейте в виду, что он не соответствует самой новой строке (то же самое для $: это означает «непосредственно перед новой строкой», но он не соответствует самой новой строке).
  • Тогда (.+?)\n\n означает «сопоставить как можно меньше символов (разрешены все символы), пока вы не дойдете до двух символов новой строки». Результат (без символов новой строки) помещается в первую группу.
  • [A-Z]+\n означает «сопоставить как можно больше заглавных букв, пока не дойдете до новой строки. Это определяет то, что я буду называть текстовой строкой.
  • ((?: текстовая строка )+) означает соответствие одной или нескольким текстовым строкам, но не помещает каждую строку в группу. Вместо этого поместите все текстовые строки в одну группу.
  • Вы можете добавить последний элемент \n в регулярное выражение, если хотите, чтобы в конце был двойной символ новой строки.
  • Кроме того, если вы не уверены, какой тип новой строки вы получите (\n или \r или \r\n), просто исправьте регулярное выражение, заменив каждое вхождение \n на (?:\n|\r\n?).

python

regex

multiline

2022-11-18T16:29:20+00:00
Вопросы с похожей тематикой, как у вопроса:

Регулярное выражение, соответствующее многострочному блоку текста