sto parsing (specie) i nomi del modulo:espressione regolare va in loop infinito
Parus Ater
H. sapiens
T. rex
Tyr. rex
che hanno normalmente due termini (binomio), ma a volte hanno 3 o più.
Troglodytes troglodytes troglodytes
E. rubecula sensu stricto
ho scritto
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s*[a-z]+)*
che ha lavorato la maggior parte del tempo, ma di tanto in tanto è andato in un ciclo infinito. C'è voluto del tempo per rintracciare che era in corrispondenza regex e poi ho capito che era un errore di battitura e ho dovuto scrivere
[A-Z][a-z]*\.?\s+[a-z][a-z]+(\s+[a-z]+)*
che svolge correttamente.
Le mie domande sono:
- Perché questo ciclo accada?
- c'è un modo per verificare errori di espressioni regolari simili prima di eseguire il programma? Altrimenti potrebbe essere difficile intercettarli prima che il prgram sia distribuito e causare problemi.
[Nota: Non ho bisogno di un'espressione più generale per le specie - non v'è una specifica formale 100 + linea di espressioni regolari per i nomi di specie - questo era solo un primo filtro].
NOTA: Il problema è sorto perché, anche se la maggior parte dei nomi sono stati estratti con precisione in 2 o occasionalmente 3/4 termini (come lo erano in corsivo) ci sono stati un paio di falsi positivi (come "Homo sapiens lives in big cities like London"
) e la partita non riesce a "L". ]
NOTA: nel debug di questo ho trovato che la regex si completava spesso ma era molto lenta (ad esempio su stringhe di destinazione più corte). È prezioso che ho trovato questo bug attraverso un caso patologico. Ho imparato una lezione importante!
Non si può semplicemente prevedere se una regex inserirà un ciclo infinito. Se hai espressioni regex troppo complesse ("100+ regex di riga"), potrebbe essere (dico "potrebbe") che hai bisogno di un qualche tipo di parser. –
Penso che dovresti scrivere '(\ s + [az] +) +' invece di '\ s + [az] [az] + (\ s + [az] +) *' – shift66
@ shift66 Ho scritto '\ s + [az] [az] + 'perché volevo assicurarmi che il secondo termine avesse almeno 2 caratteri. Non mi interessa il terzo e più tardi. –