2011-12-05 13 views
8

Sto cercando un'espressione regolare per abbinare le parole con trattino in python.Python Regex per parole con trattino

Il più vicino sono riuscito a ottenere è: '\ w + - \ w + [- w +] *'

text = "one-hundered-and-three- some text foo-bar some--text" 
hyphenated = re.findall(r'\w+-\w+[-\w+]*',text) 

che restituisce la lista [ 'one-hundered-e-tre', 'foo -bar'].

Questo è quasi perfetto tranne il trattino finale dopo "tre". Voglio solo il trattino aggiuntivo se seguito da una 'parola'. cioè invece del '[- \ w +] *' ho bisogno di qualcosa come '(- \ w +) *' che pensavo avrebbe funzionato, ma non lo fa (restituisce ['-three,' ']). cioè qualcosa che corrisponde alla parola seguita da trattino seguita dalla parola seguita da hyphen_word zero o più volte |.

+1

Non so che cosa si prevede di utilizzare questo per, ma hai considerato casi in cui un finale o un trattino prefisso è [valido] (http://en.wikipedia.org/wiki/Hyphen) , come "il diciannovesimo e il ventesimo secolo" o "posseduto e gestito da investitori"? –

+1

Il problema principale nella tua espressione sono le parentesi quadre. Non raggruppano il contenuto insieme, creano una classe di caratteri, questo è qualcosa di completamente diverso. – stema

+0

Grazie per l'input, lazyr. Ho preso in considerazione i casi che lei segnala e non costituiranno un problema. Grazie per il chiarimento, stema. Mi sono reso conto che le parentesi quadre non raggruppavano il contenuto, ma hanno provocato la corrispondenza più vicina a ciò che stavo tentando di fare. – Sixhobbits

risposta

18

Prova questo:

re.findall(r'\w+(?:-\w+)+',text) 

Qui consideriamo una parola sillabata essere:

  • un certo numero di caratteri di parola
  • seguita da un numero qualsiasi di:
    • un singolo trattino
    • seguito da parole chars
Problemi correlati