Aqui está a maneira mais simples de explicar isso. Aqui está o que estou usando:
re.split('\W', 'foo/bar spam\neggs')
-> ['foo', 'bar', 'spam', 'eggs']
Aqui está o que eu quero:
someMethod('\W', 'foo/bar spam\neggs')
-> ['foo', '/', 'bar', ' ', 'spam', '\n', 'eggs']
O motivo é que eu quero dividir uma string em tokens, manipulá-la e juntá-la novamente.
\W
significa? Eu falhei no google.Respostas:
fonte
['foo', '/bar', ' spam', '\neggs']
?re.split('% ', re.sub('% ', '%% ', '5.000% Additional Whatnot'))
->['5.000%', 'Additional Whatnot']
Se você estiver dividindo em nova linha, use
splitlines(True)
.(Não é uma solução geral, mas adicione-a aqui caso alguém venha aqui sem perceber que esse método existia.)
fonte
Outra solução sem regex que funciona bem em Python 3
fonte
Se você tiver apenas 1 separador, poderá empregar a compreensão da lista:
Separador de anexos / anexos:
Separador como elemento próprio:
fonte
if x
para garantir que o pedaço produzido porsplit
tenha algum conteúdo, ou seja,result = [x + sep for x in text.split(sep) if x]
result = [sep+x for x in data.split(sep)]
result[0] = result[0][len(sep):]
outro exemplo, divida em não alfanumérico e mantenha os separadores
resultado:
explicação
fonte
\W
seja uma maneira mais compacta de expressá-la.Você também pode dividir uma string com uma matriz de strings em vez de uma expressão regular, assim:
fonte
fonte
Uma solução simples e preguiçosa
Suponha que seu padrão regex seja
split_pattern = r'(!|\?)'
Primeiro, você adiciona o mesmo caractere que o novo separador, como '[cut]'
new_string = re.sub(split_pattern, '\\1[cut]', your_string)
Então você divide o novo separador,
new_string.split('[cut]')
fonte
[cut]
algum lugar.Se alguém quiser dividir uma string enquanto mantém os separadores por regex sem capturar o grupo:
Se alguém assumir que a regex está agrupada no grupo de captura:
Ambas as formas também removerão grupos vazios que são inúteis e irritantes na maioria dos casos.
fonte
Aqui está uma
.split
solução simples que funciona sem regex.Esta é uma resposta para o Python split () sem remover o delimitador ; portanto, não exatamente o que a postagem original pergunta, mas a outra pergunta foi fechada como duplicada para esta.
Testes aleatórios:
fonte
Tive um problema semelhante ao tentar dividir o caminho de um arquivo e lutei para encontrar uma resposta simples. Isso funcionou para mim e não envolveu a necessidade de substituir delimitadores novamente no texto dividido:
my_path = 'folder1/folder2/folder3/file1'
import re
re.findall('[^/]+/|[^/]+', my_path)
retorna:
['folder1/', 'folder2/', 'folder3/', 'file1']
fonte
re.findall('[^/]+/?', my_path)
(por exemplo, fazendo a barra final opcional usando um?
em vez de fornecer duas alternativas com|
.Achei essa abordagem baseada em gerador mais satisfatória:
Isso evita a necessidade de descobrir o regex correto, enquanto na teoria deve ser bastante barato. Ele não cria novos objetos de sequência e delega a maior parte do trabalho de iteração para o método find eficiente.
... e no Python 3.8 pode ser tão curto quanto:
fonte
substitua tudo
seperator: (\W)
porseperator + new_seperator: (\W;)
dividido pelo
new_seperator: (;)
fonte