1
votes

Python regex pour capturer du texte entre deux correspondances?

Je voudrais utiliser une expression régulière qui correspond à n'importe quel texte entre deux chaînes:

DATE POSTED: MAY 30, 2018, some text here, Garcia Answer 1: more text, DATE POSTED: MARCH 8, 2017, some text here, Smith Answer 2: more text, DATE POSTED: JUNE 17, 2018, some text here, Jones Answer 1: more text...

Dans cet exemple, je voudrais rechercher le DATE POSTED: [* date *], et , [* Name *] Répondez à [* number *]: et saisissez tout ce qui se trouve entre les deux.

En d'autres termes, j'aimerais trouver tout du texte ici

J'utilise Python 3x.


3 commentaires

cela aide-t-il?


Depuis, vous êtes un nouveau contributeur; il se peut donc que vous n'ayez pas lu la documentation sur la façon d'accepter une réponse. Si une réponse vous aide, pensez à l'accepter en cochant la case en dessous. Il est utile tant pour le répondeur que pour la communauté puisque les futurs lecteurs bénéficient des publications. Même si; il n'est pas pressé d'accepter une réponse. Prenez votre temps pour trouver la réponse qui vous convient le mieux mais assurez-vous de l'accepter après avoir trouvé la réponse qui vous convient le mieux. Pour de meilleures informations, veuillez lire stackoverflow.com/help/someone-answers


Veuillez reconnaître si vous avez besoin d'autre chose dans les réponses?


3 Réponses :


0
votes
import re 

t = "DATE POSTED: MAY 30, 2018, some text here, Garcia Answer 1: more text, DATE POSTED: MARCH 8, 2017, some text here, Smith Answer 2: more text, DATE POSTED: JUNE 17, 2018, some text here, Jones Answer 1: more text..."


out = re.split("Answer [0-9]{1}",t)

out = [",".join(x.split(",")[0:-1]) for x in out]

out = [re.split("[0-9]{4},",x) for x in out]

out = [x[-1] for x in out]

print(out)
will print everything out as a list

1 commentaires

Merci pour la réponse. Les exemples que j'ai postés plus tôt font en fait partie de la même chaîne (voir modifier)



0
votes

Voici comment:

['some text here']

Sortie:

import re
s = "DATE POSTED: MAY 17, 2018, some text here, Garcia Answer 1: more text"
print(re.findall(r'(?<=DATE POSTED: MAY 17, 2018, )(.*)(?=, Garcia Answer 1)',s))


1 commentaires

Merci pour la réponse. Mais votre solution ne fonctionne que pour 1 exemple très spécifique. Existe-t-il un moyen d'extraire tout le "texte ici"?



0
votes

Vous pouvez essayer:

import re

regex = r"DATE POSTED: .*?, \d{4}, (.*?),"

test_str = "DATE POSTED: MAY 30, 2018, some text here1, Garcia Answer 1: more text, DATE POSTED: MARCH 8, 2017, some text here2, Smith Answer 2: more text, DATE POSTED: JUNE 17, 2018, some text here3, Jones Answer 1: more text..."

matches = re.findall(regex, test_str)
print(matches)
# For making a difference between strings I used "some text here1, 2 and 3".
# output: matches = ['some text here1', 'some text here2', 'some text here3']

Explication de l'expression régulière ci-dessus:

DATE POSTED:. * ?, - Correspond à DATE POSTED: littéralement avec tout ce qui suit avant le premier , . C'est la raison pour laquelle j'ai utilisé la correspondance différée, c'est-à-dire . *? .

\ d {4}, - Correspond à la partie année, c'est-à-dire que \ d {4} représente 4 chiffres de l'année avant un , .

(. *?), - Représente un groupe de capture correspondant à tout ce qui suit paresseusement avant le premier , code > caractère.

Vous pouvez trouver la démo de l'expression régulière ci-dessus dans ici. strong>

 Représentation picturale

Implémentation en python:

DATE POSTED: .*?, \d{4}, (.*?),


0 commentaires