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

ho bisogno di tutti loro, ma ritorna:pitone: regex ottiene solo l'ultima occorrenza

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

con:

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

ottengo tutti loro, ma la prima parola è fuori ...

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

questo testo è testo casuale l'ho messo perché f la qualità standars StackOverflow

risposta

0

finalmente lo faccio con questo codice:

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

uscita:

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

tutte queste soluzioni sono fantastiche, grazie :)

3

Ecco come si può fare:

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

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

Ogni partita restituisce un gruppo di lettere (con o senza parentesi).

+0

mmm ma funziona senza la prima parola ... grgrgrgrgrgr – ZiTAL

1

C'è una sola corrispondenza: la parte "^(\w+)" corrisponde a "aaaa" e le partite di parte "(\[\w+\])*$""[ab][cd][ef]". Nota che ottieni un elenco di un elemento (che è una tupla), quindi c'è una sola corrispondenza. Ogni coppia di parentesi che usi nella regexp genera un elemento nella tupla, con il testo che corrisponde a qualsiasi cosa ci sia dentro. Ci sono due coppie, quindi ci sono due elementi nella tupla. La seconda coppia di parentesi è contrassegnata come speciale, ma questo fa sì che il risultato venga "assegnato" più volte (il che sembra mantenere l'ultimo valore): non moltiplica le parentesi, quindi non si ottiene una tupla più grande.

Non sono sicuro di cosa ti aspetti, quindi non so cosa suggerire regexp.

+0

lo farò in 2 passi non c'è problema :) grazie per le informazioni – ZiTAL

1

In base al tuo commento sulla risposta di aix, sembra che tu voglia richiedere la corrispondenza della parte non a parentesi, forse qualcosa di simile è ciò che stai cercando?

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

Se avete bisogno di ottenere il risultato ['aaaa', '[ab]', '[cd]', '[ef]'] invece di quanto sopra evidenziato qui è un metodo:

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