2010-04-20 6 views
23

J'utilise actuellement des expressions régulières pour rechercher dans les flux RSS si certains mots et certaines phrases sont mentionnés, et j'aimerais ensuite extraire le texte de chaque côté du match. Par exemple:Python - Localisation de la position d'une correspondance regex dans une chaîne?

String = "This is an example sentence, it is for demonstration only" 
re.search("is", String) 

Je voudrais connaître la position (s) de l'endroit où les matchs « est » se trouvent pour que je puisse extraire et quelque chose de sortie comme ceci:

1 match found: "This is an example sentence" 

Je sais que ce serait facile à faire avec des divisions, mais je devrais savoir quel était l'index du premier caractère du match dans la chaîne, que je ne sais pas comment trouver

+2

vous trouveriez "is" deux fois dans votre exemple. – extraneon

Répondre

38

Vous pouvez utiliser .find("is"), il retournerait la position de "est" dans la chaîne

ou utiliser .start() de re

>>> re.search("is", String).start() 
2 

fait son premier match "est" de "Th est"

Si vous devez faire correspondre par mot, vous devez utiliser \b avant et après "est", \b est le mot limite.

>>> re.search(r"\bis\b", String).start() 
5 
>>> 

pour plus d'informations sur les expressions régulières de python, docs ici

+0

Aucune idée de comment j'ai manqué cela dans la documentation, fait exactement ce dont j'avais besoin, merci! –

+0

Si vous voulez saisir seulement le mot "est" je pense 're.search (" est ", String) .start()' devrait aussi le mot .. bien sûr, il y a d'autres exemples aussi. – kuskmen

+0

Méfiez-vous du fait que re.search renvoie None s'il n'y a pas de correspondance. – rstackhouse

19

Je ne pense pas que cette question a été complètement encore répondu parce que tous les réponses ne donnent que des exemples de correspondance unique. La question de l'OP montre les nuances d'avoir 2 correspondances ainsi qu'une correspondance de sous-chaîne qui ne devrait pas être rapportée car ce n'est pas un mot/jeton.

Pour correspondre à plusieurs occurrences, on peut faire quelque chose comme ceci:

iter = re.finditer(r"\bis\b", String) 
indices = [m.start(0) for m in iter] 

Ce renverrait une liste des deux indices de la chaîne d'origine.

Questions connexes