【问题标题】:regex count occurrences正则表达式计数出现
【发布时间】:2018-11-06 01:48:34
【问题描述】:

我正在寻找一种方法来根据我的正则表达式计算在字符串中找到的出现次数。我使用 findall() 并返回一个列表,但列表的 len() 只有 1?列表的 len() 不应该是 2 吗?

import re

string1 = r'Total $200.00 Total $900.00'
regex = r'(.*Total.*|.*Invoice.*|.*Amount.*)?(\s+?\$\s?[1-9]{1,10}.*(?: 
[.,]\d{3})*(?:[.,]\d{2})?)'
patt = re.findall(regex,string1)
print(patt)
print(len(patt))

结果:

>     [('Total $200.00 Total', ' $900.00')]
>     1

不确定我的正则表达式是否导致它计算错误。我希望从文件中获取总计,但有很多组合。 例子:

  • 总计 900.00 美元
  • 发票金额 500.00 美元
  • 总计 800.00

等等

我希望对此进行计数,因为一个文件中可能有多个发票详细信息。

【问题讨论】:

    标签: python regex


    【解决方案1】:

    首先,因为这是一个常见的误解:

    无需匹配“匹配前的所有文本”或“匹配后的所有文本”。您可以在您的正则表达式中删除那些.*。从您实际想要匹配的内容开始。

    import re
    
    string1 = 'Total $200.00 Total $900.00'
    
    amount_pattern = r'(?:Total|Amt|Invoice Amt|Others)[:\s]*\$([\d\.,]*\d)'
    amount_expr = re.compile(amount_pattern, re.IGNORECASE)
    
    amount_expr.findall(string1)
    # -> ['200.00', '900.00']
    

    \$([\d\.,]*\d) 是价格的合理近似值(“以$ 开头,然后包含一堆数字,可能还有点和逗号”)。最后的\d 确保我们不会意外匹配句子标点符号。它可能已经足够好了,但您知道您正在使用哪些数据。随意提出更具体的子表达式。如果您希望看到负数,请添加可选的前导 -

    【讨论】:

    • 这绝对比我自己的效果更好,感谢 Tomalak!
    【解决方案2】:

    试试:

    >>> re.findall(r'(\w*\s+\$\d+\.\d+)', string1)
    ['Total $200.00', 'Total $900.00']
    

    您遇到的问题是您的正则表达式有两个捕获组,因此re.findall 返回这两个匹配项的元组。一个包含两个匹配项的元组的长度为 1。

    【讨论】:

      猜你喜欢
      • 2012-08-04
      • 2015-04-17
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多