【问题标题】:Python regex with look behind and alternatives带有后视和替代方法的 Python 正则表达式
【发布时间】:2012-01-01 22:16:45
【问题描述】:

我想要一个正则表达式来查找“包裹”在“HEAD or HEADa”和“HEAD”之间的文本。也就是说,我可能有一个以第一个单词开头的文本为 HEAD 或 HEADa,并且后面的“头”属于 HEAD 类型。

  1. HEAD\n\n text...text...HEAD \n\n text....text HEAD\n\n text....text .....
  2. HEADa\n\n text...text...HEAD \n\n text....text HEAD\n\n text....text .....

我只想捕获“头”之间的文本,因此我有一个正则表达式,带有向后看和向前看的表达式来寻找我的“头”。我有以下正则表达式:

var = "HEADa", "HEAD"

my_pat = re.compile(r"(?<=^\b"+var[0]+r"|"+var[1]+r"\b) \w*\s\s(.*?)(?=\b"+var[1] +r"\b)",re.DOTALL|re.MULTILINE)

但是,当我尝试执行此正则表达式时,我收到一条错误消息,指出我在后视表达式中不能有可变长度。这个正则表达式有什么问题?

【问题讨论】:

  • 感谢 Chris Morgan,确实更容易阅读
  • 顺便说一句,您也应该接受其他问题的答案。

标签: python regex


【解决方案1】:

目前,正则表达式的第一部分如下所示:

(?<=^\bHEADa|HEAD\b)

你有两种选择;一个匹配五个字符,另一个匹配四个,这就是您收到错误的原因。一些正则表达式风格会让你这样做,即使他们说它们不允许可变长度的后视,但 Python 不允许。你可以把它分成两个lookbehinds,像这样:

(?:(?<=^HEADa\b)|(?<=\bHEAD\b))

...但是无论如何您可能都不需要后视。试试这个:

(?:^HEADa|\bHEAD)\b

以后与(.*?) 匹配的内容仍可通过组#1 获得。如果您真的需要分隔符之间的整个文本,您可以在组 #1 中捕获 that,而其他组将成为 #2(或者您可以使用命名组,而不必保留跟踪数字)。

一般来说,向后看绝不应该是您的第一选择。这似乎是这项工作的明显工具,但您通常最好直接匹配并使用捕获组提取您想要的部分。所有的风格都是如此,不仅仅是 Python;仅仅因为您可以在其他风格的lookbehinds中做更多事情并不意味着您应该

顺便说一句,您可能已经注意到我重新分配了您的单词边界;我想这才是你真正想要的。

【讨论】:

  • 你让我明白了:) +1。此外,您可以像这样插入变量: regex = re.compile('(?
猜你喜欢
  • 1970-01-01
  • 2022-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多