贪婪的Python RegEx捕获组包括“和”

时间:2019-11-19 18:36:17

标签: python regex parsing regular-language

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

  • 第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+]+)'

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

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您可以使用

(?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个以上的可选数字