English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
一、如何拆分含有多种分隔符的字符串?
Casos reais
我们要把某个字符串依据分隔符号拆分不同的字符段,该字符串包含多种不同的分隔符,例如:
s = 'asd;aad|dasd|dasd,sdasd|asd,,Adas|sdasd;Asdasd,d|asd'
其中<,>,<;>,<|>,<\t>都是分隔符,如何处理?
Solução
连续使用split()方法,每次处理一种分隔符
# 使用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']
II, como determinar se a string a começa ou termina com a string b?
Casos reais
Se um diretório tiver os seguintes arquivos:
quicksort.c graph.py heap.java install.sh stack.cpp ......
Agora, precisamos dar permissões de execução nos arquivos com terminação .sh e .py
Solução
Usando os métodos startswith() e endswith() de string
>>> 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
III, como ajustar o formato de texto de uma string?
Casos reais
O arquivo de log de um software, onde o formato da data é yyy-mm-dd:
2016-09-15 18:27:26 statu unpacked python3-pip:all 2016-09-15 19:27:26 statu half-configured python3-pip:all 2016-09-15 20:27:26 statu installd python3-pip:all 2016-09-15 21:27:26 configure asdasdasdas:all python3-pip:all
Precisa mudar a data para o formato de data americano mm/dd/yyy, 2016-09-15 --> 09/15/2016, como lidar com isso?
Solução
Usando o método re.sub() da expressão regular para substituir strings
Utilizando grupos de captura de expressões regulares, capturar cada parte do conteúdo, na ordem dos grupos capturados na string de substituição.
>>> log = '2016-09-15 18:27:26 statu unpacked python3-pip:all' >>> import re # 按顺序 >>> re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2/\3/\1' , log) '09/15/2016 18:27:26 statu unpacked python3-pip:all' # usar grupos de expressões regulares63;P<year>\d{4})-(?P<month>\d{2})-(ɸ})', r'\g<month>/\g<day>/\g<year>' , log) '09/15/2016 18:27:26 statu unpacked python3-pip:all'
Quatro, como concatenar várias pequenas strings em uma grande string?
Casos reais
Ao projetar um programa de rede baseado em UDP, definimos um protocolo de rede personalizado, transmitindo uma série de parâmetros ao servidor em uma ordem fixa:
hwDetect: "<0112">" gxDepthBits: "<32">" gxResolution: "<1024x768">" gxRefresh: "<60>" fullAlpha: "<1">" lodDist: "<100.0>" DistCull: "<500.0>"
No programa, coletamos os parâmetros em uma lista na ordem:
["<0112">","<32">","<1024x768">","<60>","<1">","<100.0>","<500.0>"]
Finalmente, devemos concatenar todos os parâmetros em um pacote de dados para envio:
"<0112><32><1024x768><60><1><100.0><500.0>"
Solução
Iterar a lista, usar consecutivamente'+'operador concatenar cada string
>>> for n in ["<0112">","<32">","<1024x768">","<60>","<1">","<100.0>","<500.0>"]: ... result += n ... >>> result '<0112><32><1024x768><60><1><100.0><500.0>'
O método str.join() é mais rápido para concatenar todos os strings de uma lista
>>> result = ''.join(["<0112">","<32">","<1024x768">","<60>","<1">","<100.0>","<500.0>"]) >>> result '<0112><32><1024x768><60><1><100.0><500.0>'
Se a lista contiver números, pode usar geradores para a conversão:
>>> hello = [222'sd',232,2e',0.2'] >>> ''.join(str(x) for x in hello) '222sd2322e0.2'
Cinco, como alinhar strings à esquerda, direita e centro?
Casos reais
Alguns atributos estão armazenados em um dicionário:
{ 'ip':'127.0.0.1', 'blog': 'www.anshengme.com', 'title': 'Hello world', 'port': '"80' }
No programa, gostaríamos de formatar o conteúdo da seguinte maneira, como podemos proceder?
ip : 127.0.0.1 blog : www.anshengme.com title : Hello world port : 80
Solução
Use str.ljust(), str.rjust, str.center() para alinhar à esquerda, à direita e ao centro
>>> info = {'ip':'127.0.0.1','blog': 'www.anshengme.com','title': 'Hello world','port': '80'} # Obtém o comprimento máximo das chaves do dicionário >>> max(map(len, info.keys())) 5 >>> w = max(map(len, info.keys())) >>> for k in info: ... print(k.ljust(w), ':',info[k]) ... # Resultado obtido port : 80 blog : www.anshengme.com ip : 127.0.0.1 title : Hello world
Use o método format(), passando algo como '<20','>20','^2
>>> 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
Seis, como excluir caracteres não desejados da string?
Casos reais
Filtre os caracteres em branco excessivos da entrada do usuário: [email protected]
Filtre o caractere '\r' de um texto editado no Windows: hello word\r\n
Remova os sinais de combinação unicode (tôns) do texto: ‘ní hǎo, chī fàn'
Solução
Métodos strip(), lstrip(), rstrip() da stringa removem caracteres nas extremidades da string
>>> email = ' [email protected] ' >>> email.strip() '[email protected]' >>> email.lstrip() '[email protected] ' >>> email.rstrip() ' [email protected]' >>>
Para excluir caracteres em uma posição fixa, você pode usar fatiamento+Métodos de concatenação
>>> s[:3] + s[4:] 'abc123'
Método replace() da stringa ou expressão regular re.sub() para excluir caracteres em qualquer posição
>>> s = '\tabc\t'123\txyz' >>> s.replace('\t', '') 'abc'123xyz'
Usar re.sub() para excluir múltiplos
>>> import re >>> re.sub('[\t\r]','', string) 'abc123xyzopq'
O método translate() da string pode excluir vários 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'
Resumo
Aqui está a compilação de dicas de manipulação de strings em Python, onde são demonstradas através de casos, soluções e exemplos, tendo um valor de referência e referência para o aprendizado ou uso do python. Quem precisar pode consultar e referenciar.
Leitores interessados em mais conteúdo sobre Python podem consultar a seção especial deste site: 'Revisão de Dicas de Manipulação de String Python', 'Resumo de Dicas de Codificação Python', 'Resumo de Dicas de Manipulação de Imagem Python', 'Tutorial de Estructuras de Dados e Algoritmos Python', 'Resumo de Dicas de Programação Socket Python', 'Resumo de Dicas de Uso de Função Python', 'Tutorial Clássico de Entrada e Avançamento Python' e 'Revisão de Dicas de Manipulação de Arquivo e Diretório Python'.