English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Concetti di elaborazione delle stringhe in Python

Prima di tutto, come dividere una stringa che contiene più simboli di separazione?

Caso reale

Dobbiamo dividere una stringa in diversi segmenti di caratteri in base ai simboli di separazione, la stringa contiene più simboli di separazione diversi, ad esempio:

s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd'

Dove <,>,<;>,<|>,<\t> sono i simboli di separazione, come trattare?

Soluzione

Usare il metodo split() più volte, ogni volta elaborare un simbolo di separazione

# Utilizzando Python2 def mySplit(s,ds): res = [s] for d in ds: t = [] map(lambda x: t.extend(x.split(d)), res) res = t return [x for x in res if x] s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd' result = mySplit(s, ';,|\t') print(result)
C:\Users\Administrator>C:\Python\Python27\python.exe E:\python-intensive-training\s2.py ['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']

Utilizzando il metodo re.split() dell'espressione regolare, dividi la stringa in una volta

>>> import re >>> re.split('[,;\t|]+','asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd') ['asd', 'aad', 'dasd', 'dasd', 'sdasd', 'asd', 'Adas', 'sdasd', 'Asdasd', 'd', 'asd']

Secondo, come determinare se una stringa a inizia o termina con una stringa b?

Caso reale

Se un directory contiene i seguenti file:

quicksort.c graph.py heap.java install.sh stack.cpp ......

Ora è necessario assegnare i permessi eseguibili alle cartelle.sh e .py

Soluzione

Utilizzare i metodi startswith() e endswith() delle stringhe

>>> import os, stat >>> os.listdir('./') ['heap.java', 'quicksort.c', 'stack.cpp', 'install.sh', 'graph.py'] >>> [name for name in os.listdir('./') if name.endswith(('.sh','.py'))] ['install.sh', 'graph.py'] >>> os.chmod('install.sh', os.stat('install.sh').st_mode | stat.S_IXUSR)
[root@iZ28i253je0Z t]# ls -l install.sh -rwxr--r-- 1 root root 0 Set 15 18:13 install.sh

Terzo, come modificare il formato del testo all'interno di una stringa?

Caso reale

File di log di un software, con il formato della data yyy-mm-dd:

2016-09-15 18:27:26 stato unpacked python3-pip:all 2016-09-15 19:27:26 stato half-configured python3-pip:all 2016-09-15 20:27:26 stato installd python3-pip:all 2016-09-15 21:27:26 configurazione asdasdasdas:all python3-pip:all

Deve modificare il formato della data all'interno del testo in formato data americano mm/dd/yyyy, 2016-09-15 --> 09/15/2016, come trattarlo?

Soluzione

Utilizza il metodo re.sub() dell'espressione regolare per fare la sostituzione di stringa

Utilizzando i gruppi di cattura dell'espressione regolare, cattura ogni parte del contenuto e sostituisci l'ordine dei gruppi di cattura nella stringa sostituita.

>>> log = '2016-09-15 18:27:26 statu unpacked python3-pip:all' >>> import re # In sequenza >>> re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1' , log) '09/15/2016 18:27:26 statu unpacked python3-pip:all' # Utilizzando i gruppi di cattura dell'espressione regolare >>> re.sub('(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', r'\g<month>/\g<day>/\g<year>' , log) '09/15/2016 18:27:26 statu unpacked python3-pip:all'

Quarto, come concatenare più stringhe piccole in una stringa grande?

Caso reale

Quando progettiamo un programma di rete, abbiamo definito un protocollo di rete basato su UDP, che trasmette una serie di parametri in un ordine fisso al server:

hwDetect: "<0112>" gxDepthBits: "<32>" gxResolution: "<1024x768>" gxRefresh: "<60>" fullAlpha: "<1>" lodDist: "<100.0>" DistCull: "<500.0>"

Nel programma raccogliamo i vari parametri in un elenco in ordine:

["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]

Finalmente, dobbiamo concatenare i vari parametri in un pacchetto di dati da inviare:

"<0112><32><1024x768><60><1><100.0><500.0>"

Soluzione

Itera l'elenco, utilizzando l'operatore '+' consecutivamente per concatenare ogni stringa

>>> for n in ["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]: ... result += n ... >>> result '<0112><32><1024x768><60><1><100.0><500.0>'

Utilizzare il metodo str.join() per unire più rapidamente tutte le stringhe nella lista

>>> result = ''.join(["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]) >>> result '<0112><32><1024x768><60><1><100.0><500.0>'

Se la lista contiene numeri, è possibile utilizzare il generatore per la conversione:

>>> hello = [222,'sd',232,'2e',0.2] >>> ''.join(str(x) for x in hello) '222sd2322e0.2'

Cinque, come allineare una stringa a sinistra, destra e al centro?

Caso reale

Un dizionario contiene una serie di valori di attributo:

{ 'ip':'127.0.0.1', 'blog': 'www.anshengme.com', 'title': 'Hello world', 'port': '80' }

Nel programma, come possiamo stampare il contenuto in questo formato?

ip : 127.0.0.1 blog : www.anshengme.com title : Hello world port : 80

Soluzione

Usare i metodi str.ljust(), str.rjust, str.center() per allineare a sinistra, destra e al centro

>>> info = {'ip':'127.0.0.1','blog': 'www.anshengme.com','title': 'Hello world','port': '80'} # Ottenere la lunghezza massima delle chiavi del dizionario >>> max(map(len, info.keys())) 5 >>> w = max(map(len, info.keys())) >>> for k in info: ... print(k.ljust(w), ':',info[k]) ... # Risultato ottenuto port : 80 blog : www.anshengme.com ip : 127.0.0.1 title : Hello world

Utilizzare il metodo format(), passare parametri come '<20','>20','^20' per completare la stessa attività

>>> for k in info: ... print(format(k,'^'+str(w)), ':',info[k]) ... port : 80 blog : www.anshengme.com ip : 127.0.0.1 title : Hello world

Sezione 6: Come rimuovere i caratteri non necessari dalla stringa?

Caso reale

Filtrare i caratteri bianchi extra dopo l'inserimento dell'utente: [email protected]

Filtrare '\r' nei testi editati su Windows: hello word\r\n

Eliminare i simboli di combinazione unicode (tintinnio) nei testi: ‘ní hǎo, chī fàn'

Soluzione

I metodi strip(), lstrip(), rstrip() della stringa rimuovono i caratteri agli estremi della stringa

>>> email = ' [email protected] ' >>> email.strip() '[email protected]' >>> email.lstrip() '[email protected] ' >>> email.rstrip() ' [email protected]' >>>

Per eliminare un carattere in una posizione fissa, è possibile utilizzare il metodo di taglio + incollaggio

>>> s[:3] + s[4:] 'abc123'

Il metodo replace() della stringa o re.sub() dell'espressione regolare elimina i caratteri in qualsiasi posizione

>>> s = '\tabc\t123\txyz' >>> s.replace('\t', '') 'abc123xyz'

Utilizzare re.sub() per eliminare più

>>> import re >>> re.sub('[\t\r]','', string) 'abc123xyzopq'

Il metodo translate() della stringa può eliminare più tipi di caratteri in una volta

>>> import string >>> s = 'abc123xyz' >>> s.translate(string.maketrans('abcxyz','xyzabc')) 'xyz123abc'
>>> s = '\rasd\t23\bAds' >>> s.translate(None, '\r\t\b') 'asd23Ads'
# python2.7 >>> i = u'ní hǎo, chī fàn' >>> i u'ni\u0301 ha\u030co, chi\u0304 fa\u0300n' >>> i.translate(dict.fromkeys([0x0301, 0x030c, 0x0304, 0x0300])) u'ni hao, chi fan'

Sommario

Ecco riassunti i suggerimenti per la gestione delle stringhe in Python, che illustrano come risolvere i problemi attraverso casi, soluzioni e esempi, offrendo una guida preziosa per chi studia o utilizza Python. Chi ne ha bisogno può fare riferimento.

Per i lettori interessati a più contenuti su Python, consultare la sezione speciale di questo sito: "Riassunto delle tecniche di manipolazione delle stringhe in Python", "Riassunto delle tecniche di codifica in Python", "Riassunto delle tecniche di manipolazione delle immagini in Python", "Tutorial di strutture dati e algoritmi in Python", "Riassunto delle tecniche di programmazione socket in Python", "Riassunto delle tecniche di utilizzo delle funzioni in Python", "Tutorial classico di introduzione e avanzamento in Python" e "Riassunto delle tecniche di manipolazione dei file e delle directory in Python"

Ti potrebbe interessare