non capisco il motivo per cui '(\s*)+'
dà un errore 'nothing to repeat'
. Allo stesso tempo, '(\s?)+'
va bene.Esiste un motivo per cui regex python non deve compilare r '( s *) +'?
Ho scoperto che questo problema è noto da un po 'di tempo (ad esempio regex error - nothing to repeat) ma lo vedo ancora in Python 3.3.1.
Quindi mi chiedo se c'è una spiegazione razionale per questo comportamento.
In realtà voglio abbinare una linea di parole o numeri ripetuti, per esempio:
'foo foo foo foo'
mi è venuta in mente questo:
'(\w+)\s+(\1\s*)+'
E 'fallito a causa del secondo gruppo : (\1\s*)+
Nella maggior parte dei casi probabilmente non avrei più di 1 spazio tra le parole in modo che (\1\s?)+
funzionasse. Ai fini pratici di questa opzione dovrebbe funzionare anche (\1\s{0,1000})+
Aggiornamento: Penso che dovrei aggiungere che ho visto il problema in pitone solo. in Perl funziona:
`('foo foo foo foo' =~ /(\w+)\s+(\1\s*)+/) `
Non
sicuro che è equivalente ma vim funziona anche:
`\(\<\w\+\>\)\_s\+\(\1\_s*\)\+`
Update2: ho trovato un'altra implementazione delle espressioni regolari per Python che si dice per sostituire ri corrente un giorno . Ho controllato e l'errore non si verifica per i casi problematici di cui sopra. Questo modulo deve essere installato separatamente. Può essere scaricato here o tramite PyPI
Per risolvere il problema, provare questo: http://stackoverflow.com/questions/17202233/remove-all-replicas-of-a-string-more-than-x-characters-long-regex –
Non so quale sia il problema di Python, funziona bene in perl e PowerShell. Si noti, tuttavia, che ciò che si possiede corrisponderebbe a cose come 'foo foofoo' anche se funzionasse. Sto assumendo che non è ciò che si vuole, dal momento che non stai corrispondenti 'foofoo' o' foofoofoo' (in altre parole, la prima istanza deve essere seguita da spazi, ma dopo che le parole possono essere uniti). Prova questa regex: '(\ w +) \ s + (\ 1 (\ s + | $)) +'. Sospetto che sia quello che vuoi veramente, e probabilmente Python non avrà problemi con esso. –
@Adi grazie, questo è un buon punto e sì, questo è quello che voglio. Ma sfortunatamente questo non funziona ancora in python – Phoenix