如何匹配一个模式之前的所有内容,直到达到另一个模式

How to match everything before a pattern, until reach another pattern

提问人:drexalves 提问时间:9/23/2022 更新时间:9/24/2022 访问量:83

问:

使用 Python 正则表达式,我试图匹配一个模式(包括换行符)之前的所有内容,直到达到另一个模式。 这是文本:

东风集团 2836 -07-0411B
IMUD - DHI211 (MOOYEHBF P/ SHDUF)
C7000039694 (PD MOFIBD PODF BAOJFD)

下面的代码匹配“C700”模式之前的所有内容。我需要“C700”之前的所有内容,但仅限于“IMUD”(包括它)。因此,结果应为“IMUD - DHI211 (MOOYEHBF P/ SHDUF)”

(?s)^.+?(?=C700\d*(?=\s))

在 regex101 中查看:链接

Python 正则表达式 匹配

评论

1赞 RavinderSingh13 9/23/2022
欢迎来到 SO,感谢好问题(它有努力/代码和输入示例;请继续努力),请在您的问题中添加输出示例以使其更清晰,谢谢。
0赞 Wiktor Stribiżew 9/23/2022
尝试使用 和 标志。请参见 regex101.com/r/wtRD1L/2。或者,另一个建议:.请提供确切的图案要求,而不仅仅是您想要匹配的图案。^[A-Z]{4} -.*?(?=\s*C700\d*\s)msi(?mi)^\w+ - \w+\s*\([^()]*\)(?=\s*C700\d*\s)
0赞 Wiktor Stribiżew 9/27/2022
您能澄清一下要求吗?

答:

0赞 slymore 9/24/2022 #1

这里有一个简单的正则表达式来做到这一点:

pattern = re.compile(r'(IMUD .*?)(C700)', flags=re.DOTALL)

解释:

  • 第一组以非贪婪的方式捕获 IMUD 之后的所有内容(意味着当找到第二个捕获组时,它会停止捕获(IMUD .*?)(C700)
  • 我们使用标志,以便 也匹配新行re.DOTALL.\n

要获得您想要的内容,请仅检索匹配的第一个组

s = """DFGC 2836 -07-0411B
IMUD - DHI211 (MOOYEHBF P/ SHDUF)
C7000039694 (PD MOFIBD PODF BAOJFD)"""

res = pattern.search(s).group(1)
res
>>> 'IMUD - DHI211 (MOOYEHBF P/ SHDUF)\n'