贪婪 Python 正则表达式捕获组包含 "and"

Greedy Python RegEx capturing group to include "and"

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

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

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

我想包括最后列出的两个模式,但不确定如何。我通过如下修改捕获组为模式匹配 "Lines 10 and 45" 编写了这个表达式:

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

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

有什么建议吗?

您可以使用

(?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 char
  • \s* - 0+ 个空格
  • \d+(?:\.\d+)? - 1+ 位数字后跟可选的 . 和 1+ 位数字
  • (?:\s*(?:,|and)\s*\d+(?:\.\d+)?)* - 0 次或多次重复
    • \s* - 0+ 个空格
    • (?:,|and) - ,and 字符序列
    • \s* - 0+ 个空格
    • \d+(?:\.\d+)? - 1+ 位数字后跟可选的 . 和 1+ 位数字