Dividir string com base em uma expressão regular

143

Eu tenho a saída de um comando em forma de tabela. Estou analisando essa saída de um arquivo de resultado e armazenando-a em uma string. Cada elemento em uma linha é separado por um ou mais caracteres de espaço em branco, portanto, estou usando expressões regulares para corresponder a 1 ou mais espaços e dividi-lo. No entanto, um espaço está sendo inserido entre cada elemento:

>>> str1="a    b     c      d" # spaces are irregular
>>> str1
'a    b     c      d'
>>> str2=re.split("( )+", str1)
>>> str2
['a', ' ', 'b', ' ', 'c', ' ', 'd'] # 1 space element between!!!

Existe uma maneira melhor de fazer isso?

Após cada divisão str2é anexada a uma lista.

user2763554
fonte
1
Eu diminuí a votação desta pergunta. A razão é que, embora a pergunta em si seja relevante, o exemplo dado não é difícil o suficiente para realmente exigir a solução solicitada. Uma regex seria necessária se você tivesse, por exemplo, blocos de palavras, blocos de números e desejasse separá-los em diferentes variáveis.
precisa saber é o seguinte
@erikbwork eu queria remover o item espaço indesejado na cadeia resultante'str2'
user2763554
1
Sim e você pode conseguir isso usando simplesmente str1.split(). Não há necessidade de uma regex.
precisa saber é o seguinte

Respostas:

176

Ao usar (, )você está capturando o grupo; se você simplesmente removê-los, não terá esse problema.

>>> str1 = "a    b     c      d"
>>> re.split(" +", str1)
['a', 'b', 'c', 'd']

No entanto, não há necessidade de regex, str.splitsem que nenhum delimitador especificado o divida por espaço em branco para você. Esta seria a melhor maneira neste caso.

>>> str1.split()
['a', 'b', 'c', 'd']

Se você realmente queria regex, pode usá-lo ( '\s'representa espaço em branco e é mais claro):

>>> re.split("\s+", str1)
['a', 'b', 'c', 'd']

ou você pode encontrar todos os caracteres que não sejam espaços em branco

>>> re.findall(r'\S+',str1)
['a', 'b', 'c', 'd']
jamylak
fonte
4
Mantenha simples. str.splité definitivamente o melhor: D
jamylak
Como posso usar isso se tiver uma sequência que comece e termine com espaço. exemplo: 'abc de'. Para isso, a saída vem como['', 'a', 'b', 'c', 'de', '']
Rakholiya Jenish
@RakholiyaJenishstr1.split()
jamylak
@jamylak string.split()é uma opção. Eu estava perguntando se isso poderia ser feito com regex também?
Rakholiya Jenish
2
@RakholiyaJenish Você não pode usar a re.findallopção?
jamylak
24

O str.splitmétodo removerá automaticamente todo o espaço em branco entre os itens:

>>> str1 = "a    b     c      d"
>>> str1.split()
['a', 'b', 'c', 'd']

Os documentos estão aqui: http://docs.python.org/library/stdtypes.html#str.split

Trevor
fonte
1
@ GururajY.S .: str.split()é provavelmente a melhor escolha para algo tão leve como esse.
Joel Cornett
7

Quando você usa re.splite o padrão de divisão contém grupos de captura, os grupos são retidos na saída. Se você não quiser isso, use um grupo que não captura.

BrenBarn
fonte
2
Usar str.splité provavelmente melhor para o seu exemplo. Eu só queria explicar por que você consegue o comportamento que faz.
BrenBarn
2

É muito simples, na verdade. Tente o seguinte:

str1="a    b     c      d"
splitStr1 = str1.split()
print splitStr1
maldito
fonte
2
Eu marcaria isso com +1, mas você está usando ponto e vírgula feio.
jamylak
3
@jamylak Lol. Eu vou mudar eles. :) Hábito de usar java e python!
maldito
1
@ GururajY.S. Se você apenas deseja dividir em base de espaço, você deve simplesmente usarstringToSplit.split()
condenado