Metodi di stringa in Python

Completato

I metodi stringa sono uno dei tipi di metodo più comuni in Python. È spesso necessario modificare le stringhe per estrarre informazioni o adattarle a un determinato formato. Python include diversi metodi di stringa progettati per eseguire le trasformazioni più comuni e utili.

I metodi di stringa fanno parte del tipo str; ciò significa che i metodi esistono come variabili stringa o direttamente come parte della stringa. Ad esempio, il metodo .title() restituisce la stringa con iniziale maiuscola e può essere usata direttamente con una stringa:

print("temperatures and facts about the moon".title())

Output: Temperatures And Facts About The Moon

Si riscontrano lo stesso comportamento e lo stesso utilizzo anche in una variabile:

heading = "temperatures and facts about the moon"
heading_upper = heading.title()
print(heading_upper)

Dividere una stringa

Un metodo di stringa comune è .split(). Senza argomenti, il metodo separa la stringa in corrispondenza di ogni spazio. Se si usa il metodo in questo modo, viene creato un elenco di ogni parola o numero separato da uno spazio:

temperatures = "Daylight: 260 F Nighttime: -280 F"
temperatures_list = temperatures.split()
print(temperatures_list)

Output: ['Daylight:', '260', 'F', 'Nighttime:', '-280', 'F']

In questo esempio si gestiscono più righe, quindi è possibile usare il carattere di nuova riga (implicito) per suddividere la stringa alla fine di ogni riga, creando singole righe:

temperatures = "Daylight: 260 F\n Nighttime: -280 F"
temperatures_list = temperatures.split('\n')
print(temperatures_list)

Output: ['Daylight: 260 F', 'Nighttime: -280 F']

Questo tipo di suddivisione diventa utile quando è necessario un ciclo per elaborare o estrarre informazioni o quando si caricano dati da un file di testo.

Cercare una stringa

Alcuni metodi stringa possono cercare il contenuto prima dell'elaborazione, senza dover usare un ciclo. Si supponga di avere due frasi che illustrano le temperature di vari pianeti e lune. Si è tuttavia interessati solo alle temperature correlate alla nostra Luna. Vale a dire, se le frasi non parlano della Luna, non dovranno essere elaborate per estrarre informazioni.

Il modo più semplice per individuare se una determinata parola, carattere o gruppo di caratteri è presente in una stringa consiste nell'usare l'operatore in:

print("Moon" in "This text will describe facts and challenges with space travel")

Output: False

print("Moon" in "This text will describe facts about the Moon")

Output: True

Un approccio per trovare la posizione di una parola specifica in una stringa consiste nell'usare il metodo .find():

temperatures = """Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius."""
print(temperatures.find("Moon"))

Output: -1

Il metodo .find() restituisce -1 quando la parola non viene trovata oppure restituisce l'indice (il numero che rappresenta la posizione nella stringa). L’esempio seguente mostra il comportamento quando si cerca la parola Mars:

temperatures = """Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius."""
print(temperatures.find("Mars"))

Output: 64

64 è la posizione in cui "Mars" appare nella stringa.

Un altro modo per cercare contenuti consiste nell'usare il metodo .count(), che restituisce il numero totale di occorrenze di una determinata parola in una stringa:

temperatures = """Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius."""
print(temperatures.count("Mars"))
print(temperatures.count("Moon"))
1
0

Le stringhe in Python fanno distinzione tra maiuscole e minuscole, il che significa che Luna e luna sono considerate parole diverse. Per eseguire un confronto senza distinzione tra maiuscole e minuscole, è possibile convertire una stringa in tutte lettere minuscole usando il metodo .lower():

print("The Moon And The Earth".lower())

Output: the moon and the earth

Analogamente al metodo .lower(), le stringhe hanno un metodo .upper() che fa il contrario, convertendo ogni carattere in maiuscolo:

print("The Moon And The Earth".upper())

Output: THE MOON AND THE EARTH

Suggerimento

Quando si cerca e si controlla un contenuto, un approccio più affidabile consiste nel convertire una stringa in tutte lettere minuscole in modo che l'uso di maiuscole e minuscole non impedisca una corrispondenza. Ad esempio, se si sta contando il numero di volte in cui appare la parola the, il metodo non conterà le volte in cui appare The, anche se sono entrambe la stessa parola. È possibile usare il metodo .lower() per modificare tutti i caratteri in lettere minuscole.

Verifica del contenuto

In alcuni casi è necessario elaborare un testo per estrarre informazioni presentate in modo irregolare. Ad esempio, la stringa seguente è più semplice da elaborare rispetto a un paragrafo non strutturato:

temperatures = "Mars Average Temperature: -60 C"

Per estrarre la temperatura media su Marte, è possibile usare i metodi seguenti:

temperatures = "Mars Average Temperature: -60 C"
parts = temperatures.split(':')
print(parts)
print(parts[-1])
['Mars average temperature', ' -60 C']
' -60 C'

Nel codice precedente tutto quello che segue i due punti (:) viene considerato una temperatura. La stringa viene divisa in corrispondenza di :, generando un elenco di due elementi. L'uso di [-1] nell'elenco restituisce l'ultimo elemento, ovvero la temperatura in questo esempio.

Se il testo è irregolare, non è possibile usare gli stessi metodi di suddivisione per ottenere il valore. È necessario eseguire un ciclo sugli elementi e verificare se i valori sono di un determinato tipo. Python dispone di metodi che consentono di controllare il tipo di stringa:

mars_temperature = "The highest temperature on Mars is about 30 C"
for item in mars_temperature.split():
    if item.isnumeric():
        print(item)

Output: 30

Come il metodo .isnumeric(), .isdecimal() può verificare la presenza di stringhe simili a decimali.

Importante

Potrebbe essere sorprendente scoprire che "-70".isnumeric() restituirà False. Ciò è dovuto al fatto che tutti i caratteri della stringa devono essere numerici e il trattino (-) non è numerico. Se è necessario controllare i numeri negativi in una stringa, il metodo .isnumeric() non funziona.

Esistono convalide aggiuntive che si possono applicare alle stringhe per controllare i valori. Per i numeri negativi, il trattino è anteposto al numero e può essere rilevato con il metodo .startswith():

print("-60".startswith('-'))

Output: True

Analogamente, il metodo .endswith() consente di verificare l'ultimo carattere di una stringa:

if "30 C".endswith("C"):
    print("This temperature is in Celsius")

Output: This temperature is in Celsius

Trasformare il testo

Esistono altri metodi che aiutano in situazioni in cui il testo deve essere trasformato in un altro elemento. Finora, sono state esaminate stringhe in cui è possibile usare C per Celsius e F per Fahrenheit. È possibile usare il metodo .replace() per trovare e sostituire occorrenze di un carattere o di un gruppo di caratteri:

print("Saturn has a daytime temperature of -170 degrees Celsius, while Mars has -28 Celsius.".replace("Celsius", "C"))

Output: Saturn has a daytime temperature of -170 degrees C, while Mars has -28 C.

Come accennato in precedenza, .lower() è un buon modo per normalizzare il testo per eseguire una ricerca senza distinzione tra maiuscole e minuscole. Verifichiamo rapidamente se in un testo si parla di temperature:

text = "Temperatures on the Moon can vary wildly."
print("temperatures" in text)

Output: False

text = "Temperatures on the Moon can vary wildly."
print("temperatures" in text.lower())

Output: True

Potrebbe non essere necessario eseguire sempre la verifica senza distinzione tra maiuscole e minuscole, ma usare il minuscolo per tutte le lettere è un buon approccio quando il testo usa una combinazione di maiuscole e minuscole.

Dopo aver diviso il testo ed eseguito le trasformazioni, potrebbe essere necessario rimettere insieme tutte le parti. Proprio come il metodo .split() può separare i caratteri, il metodo .join() può rimetterli insieme.

Il metodo .join() richiede un oggetto iterabile (ad esempio un elenco Python) come argomento, quindi l'utilizzo è diverso da quello degli altri metodi di stringa:

moon_facts = ["The Moon is drifting away from the Earth.", "On average, the Moon is moving about 4cm every year."]
print(' '.join(moon_facts))

Output: The Moon is drifting away from the Earth. On average, the Moon is moving about 4cm every year.

In questo esempio si usa ' ' per aggiungere i singoli elementi dell'elenco.