在匹配跨越多行的文本时,我在让 Python 正则表达式工作时遇到了一些麻烦。示例文本是(’\n’ 是换行符)
some Varying TEXT\n
\n
DSJFKDAFJKDAFJDSAKFJADSFLKDLAFKDSAF\n
[more of the above, ending with a newline]\n
[yep, there is a variable number of lines here]\n
\n
(repeat the above a few hundred times).
我想捕获两件事:“some_Varying_TEXT”部分,以及在一次捕获中位于它下方两行的所有大写文本行(我可以稍后删除换行符)。我尝试了几种方法:
re.compile(r"^>(\w+)$$([.$]+)^$", re.MULTILINE) # try to capture both parts
re.compile(r"(^[^>][\w\s]+)$", re.MULTILINE|re.DOTALL) # just textlines
以及其中的许多变体,但没有运气。最后一个似乎与文字行一一对应,这不是我真正想要的。我可以抓住第一部分,没问题,但我似乎无法抓住 4-5 行大写文本。我希望 match.group(1) 是 some_Varying_Text 和 group(2) 是 line1+line2+line3+etc 直到遇到空行。
如果有人好奇的话,它应该是构成蛋白质的一系列氨基酸。
原文由 Jan 发布,翻译遵循 CC BY-SA 4.0 许可协议
试试这个:
我认为您最大的问题是您期望
^
和$
锚点匹配换行符,但它们没有。在多行模式下,^
匹配换行符 后 的位置,$
匹配换行符 前 的位置。另请注意,换行符可以包含换行符 (
\n
)、回车符 (\r
) 或回车符+换行符 (\r\n
)。如果您不确定您的目标文本是否只使用换行符,您应该使用这个更具包容性的正则表达式版本:顺便说一句,您不想在这里使用 DOTALL 修饰符;您依赖于点匹配 除 换行符以外的所有内容的事实。