我正在尝试获取表单中所有子字符串的列表:
冒号+指定序列中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()文档:
返回字符串中所有非重叠的模式匹配,作为列表 字符串
可以得出结论,上述方法应该有效。我做错了什么?
答案 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')]