Python和正则表达式。或声明

Python和正则表达式。或声明,python,regex,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-

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

第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)
问题是它在每种情况下都返回
('12345','')
('','98546')


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

如果您对编写的正则表达式感到非常满意,那么我建议您不要更改正则表达式并获得这样的值

print "".join(pat.findall(text)[0])
这将只是连接匹配结果。因为另一个组没有捕获任何内容,所以您将得到一个字符串


注意:另外,您需要在正则表达式中转义
$
,如
\$
,否则它将被视为行尾。

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

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

pat = re.compile(r'Blah: (\d+\s\d+) \$ (\((\d+\s\d+)\s*\$\))?')
之后,要获得匹配的号码,您可以使用
match.group(3)或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']

问题是我无法知道每次有人添加哪个版本的文本。@AnastasiosVentouris你的评论对我来说没有任何意义。什么是“某人添加的文本”?您从未提到添加文本。谁是某人?很抱歉让你误会了。文本不是预定义的。用户可以在web表单中添加版本1或版本2上的文本,但我不知道添加了哪个版本。因此,如果是版本2,我希望括号中的数字,否则括号外的数字。@AnastasiosVentouris是的,代码就是这样做的。如果用户输入“版本2”文本,它将返回括号中指定的数字,否则返回其他数字。