我正在尝试解析来自我的(德语)银行的交易函。我想从下面的字符串中提取所有的数字,这比我想象的要难。选项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)输出为
['', '', '', '', '', '', ',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']发布于 2013-05-01 23:33:26
选项1是正则表达式中最合适的,但它无法正常工作,因为findall将返回捕获组()匹配的内容,而不是完全匹配的内容。
例如,示例中的前三个匹配项是18、04和2013,在每种情况下,捕获组都是不匹配的,因此将向结果列表中添加一个空字符串。
解决方案是使组不被捕获
r'\d+(?:,\d+)?'选项2只有在不匹配不包含逗号的序列的情况下才有效。
选项3不是很好,因为它将匹配例如+,1。
发布于 2013-05-01 23:35:56
我想从下面的字符串中提取所有的数字...
通过“数字”,如果你指的是货币金额和日期,我认为这将会做你想要的:
print re.findall(r'[0-9][0-9,.]+', my_str)输出:
['18.04.2013', '18.04.2013', '0,9800', '18.04.2013', '78,40', '20,67', '78,40', '57,73']如果您所说的“数字”仅指货币金额,则使用
print re.findall(r'[0-9]+,[0-9]+', my_str)或者更好的是,
print re.findall(r'[0-9]+,[0-9]+ EUR', my_str)发布于 2013-05-02 00:07:03
下面是一个解决方案,它解析语句并将结果放入名为bank_statement的字典中
# -*- coding: utf-8 -*-
import itertools
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
"""
bank_statement = {}
for line in my_str.split('\n'):
tokens = line.split()
#print tokens
it = iter(tokens)
category = ''
for token in it:
if token == ':':
category = category.strip(' *')
bank_statement[category] = next(it)
category = ''
else:
category += ' ' + token
# bank_statement now has all the values
print '\n'.join('{0:.<18} {1}'.format(k, v) \
for k, v in sorted(bank_statement.items()))此代码的输出如下:
Bruttodividende... 78,40
Depotinhaber...... ME
Einbeh. Steuer.... 20,67
Endbetrag......... 57,73
Extag............. 18.04.2013
Nettodividende.... 78,40
Valuta............ 18.04.2013
Zahlungstag....... 18.04.2013
pro Stück........ 0,9800 讨论
代码逐行扫描语句字符串,然后通过标记将每行分成tokens
bank_statement['Extag']的值为'18.04.2013'https://stackoverflow.com/questions/16321007
复制相似问题