Stringa suddivisa in base a più delimitatori in Python

Dasun Nirmitha 30 gennaio 2023
  1. Stringa divisa con due delimitatori in Python
  2. Stringa divisa con più delimitatori in Python
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