2013-03-22 7 views
5

Voglio cercare una frase, abbinare fino a poche parole che la seguono, ma fermarsi presto se trovo un'altra frase specifica.Espressioni regolari: abbinare fino a una parola o un numero massimo di parole

Ad esempio, desidero associare fino a tre parole che seguono "andare al", ma interrompere il processo di abbinamento se incontro "da provare". Quindi per esempio "andare al luna park" risulterà con "luna park"; "andare nella capitale del Perù" si tradurrà in "capitale della città" e "andare sulla luna per provare un cheesecake" si tradurrà in "luna".

Può essere eseguito con una singola espressione regolare semplice (preferibilmente in Python)? Ho provato tutte le combinazioni a cui potevo pensare, ma ho fallito miseramente :).

+2

Si prega di farci vedere il tuo il tentativo più riuscito. – NPE

+0

Solo per divertimento ecco una soluzione non regex: ''' .join (text.split ('going to the') [1] .split ('to try') [0] .split() [: 3]) ' – jamylak

risposta

5

Questo corrisponde fino a 3 ({1,3}) parole seguenti going to the fintanto che non sono seguiti da provare ((?!to try)):

import re 
infile = open("input", "r") 
for line in infile: 
    m = re.match("going to the ((?:\w+\s*(?!to try)){1,3})", line) 
    if m: 
     print m.group(1).rstrip() 

uscita

luna park 
capital city of 
moon 
+0

Cambiare per andare al – jamylak

+0

Perché funziona con "andare alla bella luna grande per provare la cheesecake" e tornare "bella grande luna"? Mi aspettavo che "moon" non corrispondesse, perché è seguito da "to try" ... – EOL

+2

@EOL Considerare "andare sulla luna per provare ...": "" moon "" è seguito da "try" e fallisce il lookahead. Il motore fa tornare indietro uno spazio e poi ha una corrispondenza. Ora il prossimo carattere è lo spazio e non corrisponde a '\ w', quindi non ottieni una seconda parola. –

-2

Penso che tu stia cercando un modo per estrarre i nomi appropriati dalle frasi. Si dovrebbe guardare a NLTK per un approccio corretto. Regex può essere utile solo con un grammer limitato al contesto. D'altra parte, sembra che tu chieda la capacità di analizzare il linguaggio umano che non è banale (per i computer).

+1

Questa non è la domanda – jamylak

+2

Se qualcosa, potrebbe essere più adatto come commento. – Dukeling

Problemi correlati