Python正则表达式(正则表达式)匹配逗号分隔数 - 为什么这不起作用?

Mat*_*uer 9 python regex

我正在尝试解析我(德国)银行的交易信件.我想从以下字符串中提取所有数字,结果证明比我想象的更难.选项2几乎完全符合我的要求.我现在想要修改它以捕获例如80.

我的第一次尝试是选项1,它只返回垃圾.为什么它会返回这么多空字符串?应该始终至少有一个来自第一个\ d +的数字,不是吗?

选项3起作用(或者至少按预期工作),所以我不知何故回答了我自己的问题.我想我大部分都在抱怨为什么选项2不起作用.

# -*- coding: utf-8 -*-
import re


my_str = """
Dividendengutschrift für inländische Wertpapiere

Depotinhaber    : ME

Extag           :  18.04.2013          Bruttodividende
Zahlungstag     :  18.04.2013          pro Stück       :       0,9800 EUR
Valuta          :  18.04.2013

                                       Bruttodividende :        78,40 EUR
                                      *Einbeh. Steuer  :        20,67 EUR
                                       Nettodividende  :        78,40 EUR

                                       Endbetrag       :        57,73 EUR
"""

print re.findall(r'\d+(,\d+)?', my_str)
print re.findall(r'\d+,\d+', my_str)
print re.findall(r'[-+]?\d*,\d+|\d+', my_str)
Run Code Online (Sandbox Code Playgroud)

输出是

['', '', '', '', '', '', ',98', '', '', '', '', ',40', ',67', ',40', ',73']
['0,9800', '78,40', '20,67', '78,40', '57,73']
['18', '04', '2013', '18', '04', '2013', '0,9800', '18', '04', '2013', '78,40', '20,67', '78,40', '57,73']
Run Code Online (Sandbox Code Playgroud)

Mik*_*keM 11

选项1是最适合的正则表达式,但它无法正常工作,因为findall它将返回捕获组匹配的内容(),而不是完全匹配.

例如,您的示例中的前三个匹配将是18,042013,并且在每种情况下捕获组将是不匹配的,因此将将空字符串添加到结果列表中.

解决方案是使组不捕获

r'\d+(?:,\d+)?'
Run Code Online (Sandbox Code Playgroud)

选项2不起作用,因为它不匹配不包含逗号的序列.

选项3并不是很好,因为它会匹配例如+,1.


Dav*_*ave 5

我想从以下字符串中提取所有数字...

用“数字”表示,如果您同时表示货币金额和日期,我认为这将满足您的要求:

print re.findall(r'[0-9][0-9,.]+', my_str)
Run Code Online (Sandbox Code Playgroud)

输出:

['18.04.2013', '18.04.2013', '0,9800', '18.04.2013', '78,40', '20,67', '78,40', '57,73']
Run Code Online (Sandbox Code Playgroud)

如果用“数字”表示仅货币金额,则使用

print re.findall(r'[0-9]+,[0-9]+', my_str)
Run Code Online (Sandbox Code Playgroud)

也许更好

print re.findall(r'[0-9]+,[0-9]+ EUR', my_str)
Run Code Online (Sandbox Code Playgroud)