2011-04-08 88 views
8

快速正則表達式問題。
我試圖在python中捕獲捕獲組的多個實例(不要認爲它是python特定的),但後續捕獲似乎覆蓋了以前。多個匹配的正則表達式組捕獲

在這個過於簡單化的例子中,我基本上是試圖分裂的字符串:

x = 'abcdef' 
r = re.compile('(\w){6}') 
m = r.match(x) 
m.groups()  # = ('f',) ?!? 
我想 ('a', 'b', 'c', 'd', 'e', 'f'),但由於正則表達式覆蓋隨後的捕捉,我得到 ('f',)

這究竟是怎麼正則表達式應該表現得如何?有沒有辦法做我想要的,而不必重複六次語法?

在此先感謝!
安德魯

+1

我不這麼認爲。這些問題有re.findall和re.split。 – 2011-04-08 17:05:59

+0

[Python正則表達式多個組]的可能重複(http://stackoverflow.com/questions/4963691/python-regex-multiple-groups) – outis 2011-12-28 02:57:27

+1

這裏是關於捕獲重複組的好文章。 http://www.regular-expressions.info/captureall.html示例:!abcabc123! 對於捕獲所有abc和123都需要regex!((?:(abc)|(123))+)!.請注意額外的括號。 – b0bi 2015-11-28 08:17:08

回答

13

你不能爲此使用組,恐怕。每個組只能匹配一次,我相信所有正則表達式都是這樣工作的。一個可能的解決方案是嘗試使用findall()或類似的。

r=re.compile(r'\w') 
r.findall(x) 
# 'a', 'b', 'c', 'd', 'e', 'f' 
+1

笨蛋! *踢腿可以*爲什麼不能做到我想要的就是我想要的! - 謝謝! Andrew – 2011-04-08 17:57:17

+0

我一直在尋找命令,同時通過're.search'' re.match'和返回的're.MatchObject' – Sevenearths 2012-06-10 16:11:04

2

要查找給定字符串中的所有匹配,請使用re.findall(regex, string)。另外,如果你想在這裏獲得每一個字母,你的正則表達式應該是'(\w){1}'或只是'(\w)'

參見:

r = re.compile('(\w)') 
l = re.findall(r, x) 

l == ['a', 'b', 'c', 'd', 'e', 'f'] 
1

我想你的問題是你需要一個簡單的介紹。

然後,我採取爲例稍微複雜一些:

import re 

pat = re.compile('[UI][bd][ae]') 

ch = 'UbaUdeIbaIbeIdaIdeUdeUdaUdeUbeIda' 

print [mat.group() for mat in pat.finditer(ch)] 

結果

['Uba', 'Ude', 'Iba', 'Ibe', 'Ida', 'Ide', 'Ude', 'Uda', 'Ude', 'Ube', 'Ida'] 
4

regex模塊可以做到這一點。

> m = regex.match('(\w){6}', "abcdef") 
> m.captures(1) 
['a', 'b', 'c', 'd', 'e', 'f'] 

還與命名捕獲的工作原理:

> m = regex.match('(?P<letter>)\w)', "abcdef") 
> m.capturesdict() 
{'letter': ['a', 'b', 'c', 'd', 'e', 'f']} 

正則表達式模塊有望取代「重」模塊 - 這是一個簡易替換,作用相同,不同的是它還有更多的功能和能力。

相關問題