使用正则表达式查找除特定数字外的数字形式

时间:2021-07-08 21:47:18

标签: python regex

我想找到除特定数字以外的数字形式。 例如,我想找到这些类型的数字:

1.214,41
4,431.43
143,134.43
355.352,41
443,113,134.43
365.115.352,41

我可以用这个正则表达式来做到:

(\d{1,3}(,|.)){1,4}

除外。数字是 0.000,00。我知道我可以通过以下方式排除这些数字:

^(0.00|0,00)

但我不知道如何结合两个正则表达式。

我的文字是这样的。我提供了最少的例子,文本要长得多,而且要求的短语到处都是:

Total 341,431.43
Saldo 0.00
Saldo 0,00
Total 1,431.43
Total 0,00
Saldo 0.60
...

我的完整正则表达式如下所示:

(Saldo|Total)\s(\d{1,3}(,|.)){1,4}

与:

re.search(regex, text)

我想得到:

Total 341,431.43
Total 1,431.43
Saldo 0.60
...

但有时我会得到 0.00 或 0,00 的行。

2 个答案:

答案 0 :(得分:1)

你可能会使用

\b(?:Saldo|Total)\s(?!0[.,]00\b)\d{1,3}(?:,\d{3})*\.\d\d\b

模式匹配:

  • \b 防止部分匹配的单词边界
  • (?:Saldo|Total)\s 匹配 Saldo 或 Total 后跟一个空格字符
  • (?!0[.,]00\b) 否定前瞻,断言不是 0.000,00 直接向右
  • \d{1,3}(?:,\d{3})*\.\d\d 匹配 1-3 位数字,可选重复 3 位数字和 . 和 2 位数字
  • \b 一个词边界

看到一个 regex demo 和一个 Python demo

import re

strings = [
    "Total 341,431.43",
    "Saldo 0.00",
    "Saldo 0,00",
    "Total 1,431.43",
    "Total 0,00",
    "Saldo 0.60"
]

pattern = r"\b(?:Saldo|Total)\s(?!0[.,]00\b)\d{1,3}(?:,\d{3})*\.\d\d\b"
for s in strings:
    m = re.search(pattern, s)
    if m:
        print(s)

输出

Total 341,431.43
Total 1,431.43
Saldo 0.60

答案 1 :(得分:0)

您不需要对所有事情都使用正则表达式。如果您正在处理一堆独立的行,请分别处理它们。在这种情况下,您可以根据需要应用任意数量的测试:

incl = re.compile(r'(Saldo|Total)\s(\d{1,3}(,|.)){1,4}')
excl = {'0.00', '0,00'}
for line in text.splitlines():
    if incl.fullmatch(line) and line not in excl:
        print(line)

或者你可以建立一个列表供以后使用:

result = [line for line in text.splitlines() if incl.fullmatch(line) and line not in excl]
print('\n'.join(result))

如果您从文件中获取数据,最好将 for line in text.splitlines(): 替换为

for line in file:
    line.rstrip('\n')
相关问题