【问题标题】:Greedy Python RegEx capturing group to include "and"贪婪的 Python RegEx 捕获组包括“和”
【发布时间】:2020-03-15 08:52:30
【问题描述】:

我需要一些帮助来编写正则表达式。我需要一个可以匹配以下模式的表达式(包括单词和数字、空格和逗号):

  • 145 号线
  • Line3544354
  • 第 10,12 行
  • 订单项 45、10、26
  • 第 10 和 45 行

到目前为止,我写了一个包含前三个模式和所有大小写变体的表达式:

r'(?i)(line item[\.*\,*\s*\d+]+]+|line[\.*\,*\s*\d+]+|lines[\.*\,*\s*\d+]+|line items[\.*\,*\s*\d+]+)'

我想包括最后列出的两种模式,但不确定如何。我通过如下修改捕获组为模式匹配“第 10 行和第 45 行”编写了此表达式:

r'(Lines[\.*\,*\w*\s*\d+]+)'

但是,它没有按预期工作。它选择字符串中的所有单词字符。我想让我的表达保持贪婪,但不确定如何实现列表中的最后两个模式。

有什么建议吗?

【问题讨论】:

  • (?i)lines?(?:\s+items?)?\s*\d+(?:\s*(?:,|and)\s*\d+)*。或this one[...] 是字符类,不是分组结构。
  • 太好了,非常感谢。你能分享一下这个表达的简要解释吗?我想了解有什么不同?和 () 表示在表达式中。
  • 我的文本中的字符串开头也有“Line 96.1”,但这个公式没有捕获它并返回 NA。你知道为什么吗?谢谢!
  • 您没有尝试我的第二个链接解决方案。我发布了它并附有解释。

标签: python regex parsing regular-language


【解决方案1】:

你可以使用

(?i)lines?(?:\s+items?)?\s*\d+(?:\.\d+)?(?:\s*(?:,|and)\s*\d+(?:\.\d+)?)*

请参阅regex demo

模式详情

  • (?i) - 忽略大小写内联 modifier
  • lines? - linelines? quantifier 使前面的模式可选,匹配 1 或 0 次出现)
  • (?:\s+items?)? - 一个可选的 non-capturing group 匹配 1 次或 0 次出现的 1+ 个空格,后跟 item 和一个可选的 s 字符
  • \s* - 0+ 个空格
  • \d+(?:\.\d+)? - 1+ 位后跟. 和 1+ 位的可选序列
  • (?:\s*(?:,|and)\s*\d+(?:\.\d+)?)* - 0 次或多次重复
    • \s* - 0+ 个空格
    • (?:,|and) - ,and 字符序列
    • \s* - 0+ 个空格
    • \d+(?:\.\d+)? - 1+ 位,后跟. 和 1+ 位的可选序列

【讨论】:

  • 太棒了,您真的是 RegEx 专家!再次感谢你。我会研究您的解释,并将其作为参考来查看我所有的 RegEx 公式。
  • @brightcitrus 我不知道你的输入有多乱,所以我建议了最安全的模式。它有点长,但很精确。您可以进一步尝试替换部分正则表达式,看看它是否仍然满足您的需求,例如,将\d+(?:\.\d+)? 替换为\d[.\d]*,甚至将整个\s*\d+(?:\.\d+)?(?:\s*(?:,|and)\s*\d+(?:\.\d+)?)* 替换为(?:and|[ \d.,])*.... :)
  • 你好 Wiktor,我有一个简单的问题。如何使用“或”语句实现此模式?我希望表达式搜索并返回 fmea 或 doc- 的所有实例,例如: r'((?i)(fmea|doc\-?)\s*\d+(?:\.\d+)?( ?:\s*(?:,|and)\s*\d+(?:\.\d+)?)*)' 但是表达式变得懒惰。请问有什么小费吗?谢谢。
  • @brightcitrus 看起来你只包含了一个重复的字符串,请参阅this demo - 这是你要找的吗?
  • @brightcitrus 我不太明白你的意思。请在ideone.com/hw8tYZ 提供可重现的示例。你可以 fork 这个演示。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 2012-06-27
  • 2011-08-29
相关资源
最近更新 更多