我有一条线(和任意数量的线) 0 1 1 75 55
我可以通过
来实现x = re.search("\d+\s+\d+\s+(\d+)\s+(\d+)\s+(\d+)", line)
if x != None:
print(x.group(1))
print(x.group(2))
print(x.group(3))
但必须有一种更简洁的方式来写这个。我正在查看文档以重复前面的表达式并找到(exp){m times}。
所以我试试
x = re.search("(\d+\s+){5}", line)
然后期望x.group(1)为0,2将为1,3为1,依此类推 但是x.group(1)输出55(最后一个数字)。我有点困惑。感谢。
另请注意。你们对正则表达式的在线教程(或免费下载书籍)有任何建议吗?
答案 0 :(得分:3)
重复捕获组does not work, and won't any time soon(在能够单独实际访问匹配的部分的意义上) - 您只需要编写正则表达式或使用字符串方法,例如{{3完全避免正则表达式。
答案 1 :(得分:2)
您是否考虑过findall重复搜索,直到输入字符串用尽并返回列表中的所有匹配项?
>>> import re
>>> line = '0 1 1 75 55'
>>> x = re.findall("(\d+)", line)
>>> print x
['0', '1', '1', '75', '55']
答案 2 :(得分:1)
在正则表达式中,只有一个组,因为您只有一对括号。正如你自己发现的那样,这个小组将返回最后一场比赛。
如果你想使用正则表达式,并且你事先知道一行中的整数,我会选择
x = re.search("\s+".join(["(\d+)"] * 5), line)
在这种情况下。
(注意
x = re.search("(\d+\s+){5}", line)
在最后一个数字之后需要一个空格。)
但是对于你给出的例子,我实际上使用了
line = "0 1 1 75 55"
int_list = map(int, line.split())
答案 3 :(得分:0)
import re
line = '0 1 2 75 55'
x = re.search('\\s+'.join(5*('(\\d+)',)), line)
if x:
print '\n'.join(x.group(3,4,5))
BOF
或者,有了Sven Marnach的想法:
print '\n'.join(line.split()[2:5])