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.


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']

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


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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.