我想找到除特定数字以外的数字形式。 例如,我想找到这些类型的数字:
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.00
或 0,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 的行。
答案 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.00
或 0,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')