Divida uma string em dois pedaços de comprimentos diferentes com base no caractere em Python

Oct 06 2020

Portanto, tenho um arquivo parecido com este:

oak
elm
tulip
redbud
birch

/plants/

allium
bellflower
ragweed
switchgrass

Tudo que eu quero fazer é dividir as árvores e espécies herbáceas em dois pedaços para que eu possa chamá-los separadamente assim:

print(trees)
oak
elm
tulip
redbud
birch

print(herbs)
allium
bellflower
ragweed
switchgrass

Como você pode ver nos dados de amostra, os fragmentos de dados são de comprimento desigual, então tenho que dividir com base no divisor "/ plants /". Se eu tentar fazer a emenda, os dados serão separados apenas por um espaço:

for groups in plant_data:
    groups  = groups.strip()
    groups = groups.replace('\n\n', '\n')
    pos = groups.find("/plants/") 
    trees, herbs = (groups[:pos], groups[pos:])
print(trees)
oa
el
tuli
redbu
birc



alliu
bellflowe
ragwee
switchgras

Se eu tentar simplesmente dividir, estou obtendo listas (o que seria bom para meus propósitos), mas elas ainda não estão divididas em dois grupos:

for groups in plant_data:
    groups  = groups.strip()
    groups = groups.replace('\n\n', '\n')
    trees = groups.split("/plants/")
print(trees)
['oak']
['elm']
['tulip']
['redbud']
['birch']
['']
['', '']
['']
['allium']
['bellflower']
['ragweed']
['switchgrass']

Para remover linhas em branco, que eu pensei que fosse o problema, tentei o seguinte: Como faço para remover linhas em branco de uma string em Python? E eu sei que dividir uma string por um caractere foi perguntado da mesma forma aqui: Python: divida uma string pela posição de um caractere

Mas estou muito confuso sobre por que não consigo fazer esses dois se separarem.

Respostas

3 buran Oct 06 2020 at 03:24
spam = """oak
elm
tulip
redbud
birch

/plants/

allium
bellflower
ragweed
switchgrass"""

spam = spam.splitlines()
idx = spam.index('/plants/')
trees, herbs = spam[:idx-1], spam[idx+2:]   
print(trees)
print(herbs)

resultado

['oak', 'elm', 'tulip', 'redbud', 'birch']
['allium', 'bellflower', 'ragweed', 'switchgrass']

Claro, em vez de brincar com idx-1, idx + 2, você pode remover str vazio usando uma abordagem diferente (por exemplo, compreensão de lista)

spam = [line for line in spam.splitlines() if line]
idx = spam.index('/plants/')
trees, herbs = spam[:idx], spam[idx+1:]