Stringa suddivisa in base a più delimitatori in Python
Il metodo Python string split()
permette di dividere facilmente una stringa in una lista basato su un delimitatore. Sebbene in alcuni casi, potrebbe essere necessario che la separazione avvenga in base non solo a uno ma a più valori delimitatori. Questo rapido articolo 101 introduce due convenienti approcci che possono essere ottenuti in Python.
Stringa divisa con due delimitatori in Python
Assumi la seguente stringa.
text = "python is, an easy;language; to, learn."
Per il nostro esempio, dobbiamo dividerlo con un punto e virgola seguito da uno spazio ;
, O da una virgola seguita da uno spazio ,
. In questo caso, qualsiasi occorrenza di punto e virgola singolare o virgola, ad esempio ,
, ;
senza spazi finali non dovrebbe essere interessato.
Espressioni regolari
Sebbene l’uso di espressioni regolari sia spesso disapprovato a causa della sua natura piuttosto costosa quando si tratta di analizzare le stringhe, può essere tranquillamente garantito in una situazione come questa.
Usa l’espressione di base
Il modulo integrato di Python re
ha un metodo split()
che possiamo usare in questo caso.
Usiamo un’espressione regolare di base a o b (a|b
) per separare i nostri delimitatori multipli.
import re
text = "python is, an easy;language; to, learn."
print(re.split("; |, ", text))
Produzione:
['python is', 'an easy;language', 'to', 'learn.']
Come menzionato nella pagina di Wikipedia, le espressioni regolari utilizzano IEEE POSIX come standard per la sua sintassi. Facendo riferimento a questo standard, possiamo amministrare molti altri modi in cui possiamo arrivare a scrivere un’espressione regolare che corrisponda al nostro caso d’uso.
Invece di usare i separatori di barre (|
) per definire i nostri delimitatori, possiamo ottenere lo stesso risultato usando la sintassi Range ([]
) fornita nelle espressioni regolari. È possibile definire un intervallo di caratteri che un’espressione regolare può corrispondere inserendoli tra parentesi quadre.
Pertanto, quando si specifica il modello della nostra espressione regolare, possiamo semplicemente fornire un punto e virgola e una virgola all’interno di parentesi quadre e uno spazio aggiuntivo [;,]
che comporterebbe che l’espressione regolare corrisponda a parti di una stringa con esattamente [un punto e virgola OR virgola] e uno spazio finale.
import re
text = "python is, an easy;language; to, learn."
print(re.split("[;,] ", text))
Rendilo una funzione
L’espressione di base menzionata in precedenza era limitata a un set di separatori hardcoded. Ciò può in seguito portare a problemi quando si verificano modifiche del delimitatore e limita anche la sua riutilizzabilità su altre parti del codice. Pertanto, è meglio in termini di utilizzo delle migliori pratiche considerare di rendere il codice più generico e riutilizzabile. Quindi codifichiamo quella logica in una funzione Python solo per essere dalla nostra parte sicura.
import re
text = "python is, an easy;language; to, learn."
separators = "; ", ", "
def custom_split(sepr_list, str_to_split):
# create regular expression dynamically
regular_exp = "|".join(map(re.escape, sepr_list))
return re.split(regular_exp, str_to_split)
print(custom_split(separators, text))
Usa funzioni stringa
Nel caso in cui desideri astenersi dall’usare le espressioni regolari o non hai bisogno di introdurre nuovi moduli nel progetto solo per dividere una stringa, puoi usare i metodi replace()
e split()
presenti nel modulo stringa stesso in una sorta di modo hacky per ottenere lo stesso risultato.
text = "python is, an easy;language; to, learn."
# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = text.replace("; ", ", ")
print(text_one_delimiter.split(", "))
Qui prima di tutto, sostituiamo tutte le occorrenze di un punto e virgola seguito da uno spazio (; )
all’interno della stringa con l’altro nostro delimitatore che è una virgola seguita da uno spazio (; )
. In questo modo possiamo limitare la suddivisione della stringa a un solo delimitatore, che in questo caso è una virgola seguita da uno spazio (; )
.
Ora possiamo dividere in modo sicuro quella stringa modificata usando la semplice funzione split()
fornita dal modulo di stringa Python per ottenere lo stesso risultato.
Nota che questa volta non abbiamo importato nuovi moduli nel codice per ottenere il risultato.
Stringa divisa con più delimitatori in Python
Considera il testo menzionato di seguito.
text = "python is# an% easy;language- to, learn."
Per questo esempio, dobbiamo dividerlo in tutte le istanze in cui il testo ha uno dei caratteri # % ; - ,
seguito da uno spazio.
Espressioni regolari
In questo caso, possiamo facilmente aggiungere i separatori aggiuntivi quando definiamo la nostra espressione regolare.
import re
text = "python is# an% easy;language- to, learn."
print(re.split("; |, |# |% |- ", text))
Produzione:
['python is', 'an', 'easy;language', 'to', 'learn.']
come una funzione
Anche in questa situazione, possiamo semplicemente usare lo stesso codice che abbiamo usato in precedenza con due delimitatori con una semplice modifica aggiungendo tutti i separatori aggiuntivi nella variabile separators
.
import re
text = "python is# an% easy;language- to, learn."
separators = "; ", ", ", "# ", "% ", "- "
def custom_split(sepr_list, str_to_split):
# create regular expression dynamically
regular_exp = "|".join(map(re.escape, sepr_list))
return re.split(regular_exp, str_to_split)
print(custom_split(separators, text))
Usa funzioni stringa
Simile al modo in cui lo abbiamo affrontato prima con due delimitatori, possiamo usare le funzioni replace()
e split()
per gestire anche questo.
text = "python is, an easy;language; to, learn."
# transform [semicolon-space] parts of the string into [comma-space]
text_one_delimiter = (
text.replace("# ", ", ").replace("% ", ", ").replace("; ", ", ").replace("- ", ", ")
)
print(text_one_delimiter.split(", "))
Produzione:
['python is', 'an easy;language', 'to', 'learn.']
Va notato che questo metodo non è consigliato se utilizzato per conteggi di delimitatori più elevati come in questo caso. Poiché in questo caso il metodo stringa replace()
dovrà essere utilizzato più volte per eseguire più traversate sulla stringa, alla fine causerebbe picchi di prestazioni indesiderati facilmente evitabili usando le espressioni regolari.
Articolo correlato - Python String
- Come controllare una stringa è vuota in modo pitonico
- Converti una stringa in nome variabile in Python
- Come rimuovere gli spazi bianchi in una stringa in Python
- Estrai numeri da una stringa in Python
- Come convertire una stringa in datario in Python
- Come convertire una stringa in minuscola in Python 2 e 3