Python和Regex。或声明

时间:2014-05-10 12:54:00

标签: python regex

我将用一个例子解释我的问题。这是我的两个不同版本的文本:

版本1:

Blah: 1 2345 $ blah blah blah

第2版:

Blah: 1 2345 $ (9 8546 $) blah blah blah

我尝试在Python中编写一个正则表达式,如果文本在版本2中,那么它将返回括号中的数字。否则,它将返回外面的数字。

pat = re.compile(r"Blah: [0-9]+\s[0-9]+ /$ \(([0-9]+\s[0-9]+)|Blah: ([0-9]+\s[0-9]+)")
pat.findall(text)

问题是它在每种情况下都会返回('1 2345', '')('', '9 8546')

如何更改正则表达式以仅返回数字?

2 个答案:

答案 0 :(得分:1)

如果您对您编写的RegEx非常满意,那么我建议您不要更改RegEx并获得这样的值

print "".join(pat.findall(text)[0])

这将只是连接匹配的结果。由于其他组没有捕获任何内容,因此您将获得一个字符串。

注意:此外,您需要在RegEx中转义$,例如\$,否则它将被视为行尾。

答案 1 :(得分:0)

不要使用findall。它有用的唯一情况是当你有一个简单的正则表达式并且你想得到它的所有匹配。当你开始捕捉群体时,它很容易变得毫无用处。

finditer方法返回匹配期间创建的实际match对象,而不是返回匹配组的元组。您可以稍微修改您的正则表达式以使用捕获组:

pat = re.compile(r'Blah: (\d+\s\d+) \$ (\((\d+\s\d+)\s*\$\))?')

然后,为了获得匹配的号码,您可以使用match.group(3) or match.group(1)选择其中一个,具体取决于是否存在带括号的匹配:

text = 'Blah: 1 2345 $ (9 8546 $) blah blah blah\nBlah: 1 2345 $ blah blah blah'
[m.group(3) or m.group(1) for m in pat.finditer(text)]

输出:

Out[12]: ['9 8546', '1 2345']