Con il modulo re
, sembra che non sono in grado di dividere su partite di pattern che sono stringhe vuote:Python regex: suddivisione in corrispondenza modello che è una stringa vuota
>>> re.split(r'(?<!foo)(?=bar)', 'foobarbarbazbar')
['foobarbarbazbar']
In altre parole, anche se un si trova la corrispondenza, se è la stringa vuota, anche re.split
non può dividere la stringa.
Il docs for re.split
sembra supportare i miei risultati.
A "soluzione" è stato abbastanza facile da trovare per questo caso particolare:
>>> re.sub(r'(?<!foo)(?=bar)', 'qux', 'foobarbarbazbar').split('qux')
['foobar', 'barbaz', 'bar']
Ma questo è un modo soggetto ad errori di farlo perché poi devo diffidare di stringhe che già contengono la stringa che sto fessurazioni sulle:
>>> re.sub(r'(?<!foo)(?=bar)', 'qux', 'foobarbarquxbar').split('qux')
['foobar', 'bar', '', 'bar']
c'è un modo migliore per dividere a una corrispondenza pattern vuoto con il modulo re
? Inoltre, perché re.split
non mi consente di farlo in primo luogo? So che è possibile con altri algoritmi split che funzionano con regex; ad esempio, sono in grado di farlo con il codice JavaScript incorporato String.prototype.split()
.
Mentre il metodo 'findall' nell'altra risposta è intelligente, richiede che il pattern" foo "venga ripetuto due volte nella stessa regex. Se "foo" fosse in realtà un segnaposto per un modello molto più complicato, sarebbe del tutto indesiderabile. Questa risposta è la più scalabile e pratica per le espressioni regolari complicate e inoltre non richiede l'installazione di moduli aggiuntivi (il che elimina anche la necessità di rifattorizzare il codice esistente per lavorare con 'regex'), ed è per questo che sono accettando questa come la migliore risposta. – Shashank
@Shashank ha aggiunto una funzione di suddivisione che funziona correttamente con corrispondenze di larghezza zero e larghezza non pari a –
In che modo il codice errato può fare affidamento su qualcosa che non è implementato? Ci sono pochissime aree per le quali Python oggettivamente fa schifo, e questo bellissimo esempio. –