Python正则表达式findall()返回不正确的子串

时间:2017-02-07 19:23:31

标签: python regex findall

我正在尝试获取表单中所有子字符串的列表:

冒号+指定序列中2个字母的序列+最小1位的数值

import re
DATA_SUB = ':(TI|LO|TE|HU|AN|FO)[0-9\.]+'
print(re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$'))

结果:

['TI', 'LO', 'TE']

其中应该是:

[':TI15', ':LO1.6213', ':TE97']

查看re.findall()文档:

  

返回字符串中所有非重叠的模式匹配,作为列表   字符串

可以得出结论,上述方法应该有效。我做错了什么?

2 个答案:

答案 0 :(得分:2)

在正则表达式中使用非捕获组而不是捕获组,以避免在findall的输出中获取捕获的数据:

>>> DATA_SUB = ':(?:TI|LO|TE|HU|AN|FO)[0-9.]+'
>>> print re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$')
[':TI15', ':LO1.6213', ':TE97']

答案 1 :(得分:2)

使用括号定义了一个捕获组,因此您要求Python返回捕获列表。通过将?:放在群组前面,您可以将其设为非捕获群组

import re
DATA_SUB = ':(?:TI|LO|TE|HU|AN|FO)[0-9\.]+'
print(re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$'))

例如,如果你要定义两个捕获组,你将生成一个元组列表,其中包含两组的捕获:

# educational counter example

import re
DATA_SUB = ':(TI|LO|TE|HU|AN|FO)([0-9\.]+)'
print(re.findall(DATA_SUB, '%145:TI15:LO1.6213:TE97$'))

将生成:

[('TI', '15'), ('LO', '1.6213'), ('TE', '97')]