English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
I. ¿Cómo dividir una cadena que contiene varios separadores?
caso real
debemos dividir una cadena de caracteres en diferentes segmentos basándonos en los símbolos de separación, la cadena contiene varios símbolos de separación diferentes, por ejemplo:
s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd'
donde <,>,<;>,<|>,<\t> son separadores, ¿cómo se manejan?
solución
usar métodos split() consecutivamente, tratando un separador cada vez
# usar 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']
>>> 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']
Segundo, ¿cómo determinar si una cadena a comienza o termina con la cadena b?}
caso real
Como en algún directorio tiene los siguientes archivos:
quicksort.c graph.py heap.java install.sh stack.cpp ......
Ahora necesitas dar permisos de ejecución a los directorios que terminan en .sh y .py
solución
Usar los métodos startswith() y endswith() de una cadena
>>> 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 Sep 15 18:13 install.sh
Tercero, ¿cómo ajustar el formato de texto en una cadena?
caso real
Un archivo de registro de un software, en el que el formato de fecha es yyy-mm-dd:
2016-09-15 18:27:26 estado desempaquetado python3-pip:all 2016-09-15 19:27:26 estado mitad-configurado python3-pip:all 2016-09-15 20:27:26 estado installd python3-pip:all 2016-09-15 21:27:26 configurar asdasdasdas:all python3-pip:all
Necesita cambiar la fecha a formato de fecha americano mm/dd/yyy, 2016-09-15 --> 09/15/2016, ¿cómo manejarlo?
solución
Usar el método de reemplazo de cadenas re.sub() de expresiones regulares
Utilizando grupos de captura de expresiones regulares, capturar cada contenido de parte, en el orden de los grupos capturados en la cadena de reemplazo.
>>> log = '2016-09-15 18:27:26 estado desempaquetado python3-pip:all' >>> import re # 按顺序 >>> re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1' , log) '09/15/2016 18:27:26 estado desempaquetado python3-pip:all' # usar grupos de expresiones regulares63;P<year>\d{4})-(?P<month>\d{2})-(ɸ})', r'\g<month>/\g<day>/\g<year>' , registro) '09/15/2016 18:27:26 estado desempaquetado python3-pip:all'
Cuatro, ¿cómo unir varias cadenas cortas en una cadena larga?
caso real
Al diseñar un programa de red basado en UDP, hemos definido un protocolo de red personalizado, que transmite una serie de parámetros en un orden fijo al servidor:
hwDetect: "<0112>" gxDepthBits: "<32>" gxResolution: "<1024x768>" gxRefresh: "<60>" fullAlpha: "<1>" lodDist: "<100.0>" DistCull: "<500.0>"
En el programa, recopilamos todos los parámetros en una lista en orden:
["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]
Finalmente, queremos unir todos los parámetros en un paquete de datos para enviar:
"<0112><32><1024x768><60><1><100.0><500.0>"
solución
Iterar la lista, usar sucesivamente 'operaciones+Unir cada cadena en sucesión utilizando 'operaciones
>>> for n in ["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"]: ... result += n ... >>> result '<0112><32><1024x768><60><1><100.0><500.0>'
El método str.join() es más rápido para unir todos los strings de una lista
>>> result = ''.join(["<0112>","<32>","<1024x768>","<60>","<1>","<100.0>","<500.0>"] >>> result '<0112><32><1024x768><60><1><100.0><500.0>'
Si hay números en la lista, se puede convertir usando un generador:
>>> hello = [222,'sd',232,'2e',0.2] >>> ''.join(str(x) for x in hello) '222sd2322e0.2'
Cinco, ¿cómo alinear una cadena a la izquierda, derecha y centro?
caso real
Almacenamos una serie de valores de propiedades en un diccionario:
{ 'ip':'127.0.0.1', 'blog': 'www.anshengme.com', 'title': 'Hello world', 'port': '80' }
En el programa, queremos exportar el contenido en el siguiente formato, ¿cómo hacerlo?
ip : 127.0.0.1 blog : www.anshengme.com title : Hello world port : 80
solución
usar str.ljust() , str.rjust, str.center() para alinear a la izquierda y a la derecha
>>> info = {'ip':'127.0.0.1','blog': 'www.anshengme.com','título': 'Hello world','puerto': '80'} # obtener la longitud máxima de las claves del diccionario >>> max(map(len, info.keys())) 5 >>> w = max(map(len, info.keys())) >>> for k in info: ... print(k.ljust(w), ':',info[k]) ... # obtener el resultado port : 80 blog : www.anshengme.com ip : 127.0.0.1 título : Hello world
usar el método format(), pasar similar a '<20','>20','^2
>>> for k in info: ... print(format(k,'^'+str(w)), ':',info[k]) ... puerto : 80 blog : www.anshengme.com ip : 127.0.0.1 título : Hello world
seis, ¿cómo eliminar caracteres innecesarios en una cadena?
caso real
eliminar los caracteres de espacio en blanco adicionales después de la entrada del usuario: [email protected]
filtrar el '\r' adicional en el texto editado en windows: hello word\r\n
eliminar los símbolos de combinación unicode (tintineo) en el texto: ‘ní hǎo, chī fàn'
solución
Los métodos de cadena strip(), lstrip(), rstrip() eliminan caracteres en los extremos de la cadena
>>> email = ' [email protected] ' >>> email.strip() '[email protected]' >>> email.lstrip() '[email protected] ' >>> email.rstrip() ' [email protected]' >>>
Para eliminar un carácter en una posición fija, puede usar el cortado+métodos de combinación
>>> s[:3] + s[4:] 'abc'123'
El método replace() de la cadena o la expresión regular re.sub() elimina caracteres en cualquier posición
>>> s = '\tabc\t'123\txyz' >>> s.replace('\t', '') 'abc'123xyz'
Usar re.sub() para eliminar varios
>>> import re >>> re.sub('[\t\r]','', string) 'abc123xyzopq'
El método translate() de la cadena puede eliminar varios tipos de caracteres diferentes
>>> 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'
Resumen
Aquí está la recopilación de técnicas de manejo de cadenas en Python, que se demuestra mediante ejemplos, soluciones y casos de estudio, lo que tiene un valor de referencia y referencia para aprender o usar Python. Aquellos que lo necesiten pueden referirse.
Más sobre Python, los lectores interesados pueden ver la sección especial de este sitio: 'Resumen de técnicas de manejo de cadenas de Python', 'Resumen de técnicas de codificación de Python', 'Resumen de técnicas de manejo de imágenes de Python', 'Tutorial de estructuras de datos y algoritmos de Python', 'Resumen de técnicas de programación de sockets de Python', 'Resumen de técnicas de uso de funciones de Python', 'Tutorial clásica de entrada y avanzado de Python' y 'Resumen de técnicas de manejo de archivos y directorios de Python'.