我是正则表达式新手,需要一些帮助。 我有代表表格的文字。我知道它将由 7 列组成:
| int | int mixed with -. | unicode string with everything | float | float | int | float |
问题是 float 是使用千位之间的空格表示的 (1234,43 => 1 234,43)。 此外,字符串可以包含空格并以数字结尾。 我试过这样的事情(对于每行换行字符条纹):
regex = re.compile(r"(\d+) ([\d.-]+) (.*) ([\d+ ]?\d+,\d+) ([\d+ ]?\d+,\d+) (\d+) ([\d+ ]?\d+,\d+)$", re.UNICODE)
w = regex.findall(line)
不幸的是,它并非在所有情况下都有效。部分测试数据:
49 602 DSKOD SMCX 262,59 1 131,30 1 1 131,30
49 602 DSKOD SMCX 3 5 262,59 1 131,30 1 1 131,30
50 61-201 łóćźż 1 2 669,50 334,75 1 334,75
51 1-214 AÓŻĆÓDS" 70,35 350,18 3 105,53
当我得到时,有数千个案例是有问题的:
[]
[]
[(u'50', u'61-201', u'\u0142\xf3\u0107\u017a\u017c 1 2', u'669,50', u'334,75', u'1', u'334,75')]
[(u'51', u'1-214', u'A\xd3\u017b\u0106\xd3DS"', u'70,35', u'350,18', u'3', u'105,53')]
在第三个示例中,我希望字符串末尾的 2 位于下一列中。 你知道有一些线索如何在 Python 2.7 上正确匹配吗?稍后我会和这个 unicode 打交道。
请您参考如下方法:
问题是 [\d+ ]?。这匹配零个或一个数字,加上空格。另一个问题是在没有某种引号的情况下使用列分隔符和字段内的空格,但这适用于您的数据。我还更改了具有额外 . 的第二列和第三列以仅获取非空格字符:
#!python3
# coding: utf-8
import re
data = '''\
49 602 DSKOD SMCX 262,59 1 131,30 1 1 131,30
49 602 DSKOD SMCX 3 5 262,59 1 131,30 1 1 131,30
50 61-201 łóćźż 1 2 669,50 334,75 1 334,75
50 61-201 łóćźż 1 669,50 334,75 1 334,75
51 1-214 AÓŻĆÓDS" 70,35 350,18 3 105,53
'''.splitlines()
regex = re.compile(r"(\d+) ([\d-]+) (.*?) ((?:\d{1,3})?(?:\ \d{3})*,\d{2}) ((?:\d{1,3})?(?:\ \d{3})*,\d{2}) (\d+) ((?:\d{1,3})?(?:\ \d{3})*,\d{2})", re.UNICODE)
for line in data:
print(regex.match(line).groups())
输出:
('49', '602', 'DSKOD SMCX', '262,59', '1 131,30', '1', '1 131,30')
('49', '602', 'DSKOD SMCX 3', '5 262,59', '1 131,30', '1', '1 131,30')
('50', '61-201', 'łóćźż 1', '2 669,50', '334,75', '1', '334,75')
('50', '61-201', 'łóćźż', '1 669,50', '334,75', '1', '334,75')
('51', '1-214', 'AÓŻĆÓDS"', '70,35', '350,18', '3', '105,53')
