2013-04-25 52 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