2013-04-25 46 views
7

我在Python中有一个正则表达式匹配对象。我想获得匹配的文本。说如果模式是'1.3',并且搜索字符串是'abc123xyz',我想要得到'123'。我怎样才能做到这一点?Python:获取正则表达式匹配的文本

我知道我可以使用match.string[match.start():match.end()],但是我发现对于这样的基本查询来说非常麻烦(并且在某些情况下是浪费的)。

有没有更简单的方法?

+0

['re.finditer() '](http://docs.python.org/2/library/re.html) – Elazar 2013-04-25 14:48:03

+1

@Elazar通过这个问题判断,OP知道如何获得'MatchObject's,但不知道如何轻松获取它们的内容。 – 2013-04-25 14:54:47

回答

7

你可以简单的使用匹配对象的group功能,如:

match = re.search(r"1.3", "abc123xyz") 
if match: 
    doSomethingWith(match.group(0)) 

获得整场比赛。 编辑:正如thg435指出的,你也可以省略0,只需拨打match.group()。附加说明:如果你的模式包含圆括号,你甚至可以通过传递1,2等到group()来获得这些子匹配。

+0

在我看来不直观......但我想这是Python提供的最好的。 – 2013-04-25 15:11:05

+0

@RamRachum我不认为这太奇怪。当你进行正则表达式替换时,你可以用'\ 1','\ 2'等(或'$ 1','$ 2',取决于实现)来引用捕获组,并且整个匹配通常通过使用' \ 0'(或'$ 0')。所以这与团体编号一致。 – 2013-04-25 15:15:56

+1

你可以忽略'0',只是'match.group()'。 – georg 2013-04-25 15:33:42

-1

你需要把正则表达式中 “()”,以便能够得到的那部分

>>> var = 'abc123xyz' 
>>> exp = re.compile(".*(1.3).*") 
>>> exp.match(var) 
<_sre.SRE_Match object at 0x691738> 
>>> exp.match(var).groups() 
('123',) 
>>> exp.match(var).group(0) 
'abc123xyz' 
>>> exp.match(var).group(1) 
'123' 

否则它不会返回任何东西:

>>> var = 'abc123xyz' 
>>> exp = re.compile("1.3") 
>>> print exp.match(var) 
None 
+1

我不认为使用'。*(...)。*'进行子串匹配是一种很好的做法。只需使用“搜索”而不是“匹配”,它可以为您完成所有工作。事实上,它甚至更胜一筹,因为你无法通过匹配获得多个匹配(相反,它将返回最后一个,这也是非常直观的,而不是第一个)。 – 2013-04-25 15:06:03