2012-02-01 35 views
5
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

text = "aaaa[ab][cd][ef]" 

a = re.compile("^(\w+)(\[\w+\])*$").findall(text) 

print a 

我需要所有的人,但它返回:蟒蛇:正則表達式只得到了最後一次出現

[('aaaa', '[ef]')] 

有:

a = re.compile("\[\w+\]").findall(text) 

我得到的所有的人,但第一個字是出...

['[ab]', '[cd]', '[ef]'] 

此文本是隨機文本我把這個,因爲o F中的計算器執行標準質量

回答

0

最後我用這個代碼做到這一點:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import re 

text = "aaaa[ab][cd][ef]" 

var = [] 
if re.match("^(\w+)(\[\w+\])*$", text): 
     a = re.findall("^\w+", text)[0] 
     var.append(a) 
     b = re.findall("\[\w+\]", text) 
     for i in b: 
       var.append(i) 
print var 

輸出:

['aaaa', '[ab]', '[cd]', '[ef]'] 

個所有這些解決方案都很好,謝謝:)

3

這裏是你如何能做到這:

In [14]: a = re.compile(r"(\w+|\[\w+\])").findall(text) 

In [15]: print a 
['aaaa', '[ab]', '[cd]', '[ef]'] 

每場比賽返回一組字母(帶或不帶支架)。

+0

嗯,但它不工作的第一個字... grgrgrgrgrgr – ZiTAL 2012-02-01 22:17:46

1

只有一個匹配項:"^(\w+)"部分匹配"aaaa""(\[\w+\])*$"部分匹配"[ab][cd][ef]"。請注意,你得到一個元素的列表(這是一個元組),所以只有一個匹配。在正則表達式中使用的每一對圓括號都會在元組中生成一個元素,其中包含與它們內部相匹配的文本。有兩對,所以元組中有兩個元素。第二對括號是加星標的,但這隻會導致該結果被多次「分配」(似乎保留最後一個值):它不會自乘括號,因此您不會獲得更大的元組。

我不知道你期望什麼,所以我不知道什麼正則表達式建議。

+0

我會做2個步驟是沒有問題的:)感謝信息 – ZiTAL 2012-02-01 22:24:54

1

基於AIX上的回答您的評論看來,你想要求非括號部分匹配,也許這樣的事情是你在找什麼呢?

>>> a = re.compile(r"^(\w+)((?:\[\w+\])*)").findall(text) 
>>> print a 
[('aaaa', '[ab][cd][ef]')] 

如果你需要得到結果的['aaaa', '[ab]', '[cd]', '[ef]']而不是什麼上面這裏顯示的是一個方法:

>>> match = re.compile(r"^(\w+)((?:\[\w+\])*)").search(text) 
>>> a = [match.group(1)] + match.group(2).replace("][", "] [").split() 
>>> print a 
['aaaa', '[ab]', '[cd]', '[ef]']