正则表达式计数

时间:2018-11-05 17:37:44

标签: python regex

我正在寻找一种方法来计算基于正则表达式的字符串中的出现次数。我使用了 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

我希望将其计算在内,因为一个文件中可能有多个发票明细。

2 个答案:

答案 0 :(得分:2)

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

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

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确保我们不会意外地匹配句子标点符号。可能足够好,但是您知道您正在使用什么数据。随意提出更具体的子表达式。如果您希望看到负数,请添加可选的前导-

答案 1 :(得分:1)

尝试:

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

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