0
votes

Collecter des sous-chaînes dans une liste lorsque vous ne connaissez que les caractères de début et de fin

Formulation un peu maladroite de la question, mais voici ce que je veux dire: j'ai une grande chaîne, appelée text . Il contient des messages provenant de différents utilisateurs et il y a certaines choses que je souhaite isoler dans la chaîne. Cela ressemble à ceci:

messages = ['hey how are you']
responses = ['im doing good'] # and so on, as many messages and responses there are

Ce que j'essaie d'isoler, ce sont les messages de user1 et les réponses. Faites donc deux listes qui ressemblent à ceci:

text = 'user1:\nhey how are you\nrandomuser:\nim doing good\nrandomuser2:\noh hey user1\n'

Bien sûr, parfois les autres utilisateurs parlent entre eux, donc je veux juste la première réponse après le message de user1. Je pense que quelque chose avec des expressions régulières peut être utilisé ici, mais j'ai du mal à trouver exactement quoi et comment.
Si des éclaircissements sont nécessaires, veuillez me le faire savoir. Merci.


0 commentaires

3 Réponses :


1
votes

Pas vraiment besoin d'expressions régulières. Au lieu de cela, scannez la chaîne et utilisez la connaissance préalable de son arrangement pour obtenir les morceaux que vous voulez.

text = 'user1:\nhey how are you\nrandomuser:\nim doing good\nrandomuser2:\noh hey user1\n'

target = 'user1:'
messages = []
responses = []

lastUser = None
isResponse = False
for v in text.split('\n'):
    if lastUser == None:
        lastUser = v
    else:
        if lastUser == target:
            messages.append(v)
            isResponse = True
        elif isResponse:
            responses.append(v)
            isResponse = False
        lastUser = None


0 commentaires

-1
votes
text = 'user1:\nhey how are you\nrandomuser:\nim doing good\nrandomuser2:\noh hey user1\n'
tokens = text.splitlines()
print(tokens)

['user1:', 'hey how are you', 'randomuser:', 'im doing good', 'randomuser2:', 'oh hey user1']
I think you can do the rest.

0 commentaires

1
votes

Si votre format est toujours comme ça (user1 et randomuser1234 ...), vous pouvez utiliser le code ci-dessous:

['hey how are you']
['im doing good', 'oh hey user1']

production:

import re

text = 'user1:\nhey how are you\nrandomuser:\nim doing good\nrandomuser2:\noh hey user1\n'

messages = []
responses = []

user1_msg = re.compile(r'user1:\n(.+)\n')
randomusers_msg = re.compile(r'randomuser\d*:\n(.+)\n')

messages.extend(user1_msg.findall(text))
responses.extend(randomusers_msg.findall(text))

print(messages)
print(responses)

J'espère que cela a aidé.


2 commentaires

Hé, merci pour la réponse! Malheureusement, les utilisateurs ont des noms différents, ce sont toutes des lettres si cela aide! Désolé, je n'ai pas précisé cela.


@BlueCyclone Alors nous avons un problème ici. Vous allez avoir besoin de dire comment vous feriez la différence entre qui demande et qui répond ... avec \w+:\n(.+)\n regex cela correspondra à des noms différents, mais vous obtiendrez ces sous-chaînes. essayer