重复以前的正则表达式

时间:2011-01-22 22:39:46

标签: python regex

我有一条线(和任意数量的线) 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(最后一个数字)。我有点困惑。感谢。

另请注意。你们对正则表达式的在线教程(或免费下载书籍)有任何建议吗?

4 个答案:

答案 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])