2012-02-01 18 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 

i potrzeba ich wszystkich, ale zwraca:python: regex pobiera tylko ostatnie wystąpienie

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

z:

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

i uzyskać wszystkie z nich, ale pierwsze słowo jest obecnie ...

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

ten tekst jest przypadkowy tekst i umieścić tego powodu O f jakości Standars StackOverflow

Odpowiedz

0

końcu zrobić z tym kodem:

#!/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 

wyjście:

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

wszystkie te rozwiązania są świetne, dzięki :)

3

Oto w jaki sposób można to zrobić:

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

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

zwraca Każdy mecz jedną grupę liter (z lub bez nawiasów).

+0

mmm ale działa bez pierwszego słowa ... grgrgrgrgrgr – ZiTAL

1

Jest tylko jeden mecz: the "^(\w+)" część pasuje "aaaa" i "(\[\w+\])*$" część pasuje "[ab][cd][ef]". Zauważ, że otrzymujesz listę jednego elementu (który jest krotką), więc istnieje tylko jedno dopasowanie. Każda para nawiasów, których używasz w wyrażeniu regularnym, generuje element w krotce, z tekstem dopasowanym do tego, co było w środku. Są dwie pary, więc w krotce są dwa elementy. Druga para nawiasów jest oznaczona gwiazdką, ale to tylko powoduje, że wynik jest "przypisywany" wiele razy (co wydaje się zachować ostatnią wartość): nie mnoży on samych nawiasów, więc nie dostajesz większej krotki.

Nie jestem pewien, czego się spodziewasz, więc nie wiem, co sugerować wyrażenie regularne.

+0

zrobię to w 2 krokach nie ma problemu :) dzięki za informację – ZiTAL

1

Na podstawie Twojego komentarza dotyczącego odpowiedzi Aix wydaje się, że chcesz wymagać dopasowania części nieobjętej blokadami, może coś takiego właśnie szukasz?

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

Jeśli trzeba uzyskać wynik ['aaaa', '[ab]', '[cd]', '[ef]'] zamiast tego, co przedstawiono powyżej tutaj jest jedna metoda:

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