108 votes

Trouver les index de toutes les correspondances d'expressions rationnelles ?

J'analyse des chaînes qui peuvent contenir n'importe quel nombre de chaînes entre guillemets (j'analyse du code et j'essaie d'éviter PLY). Je veux savoir si une sous-chaîne est citée, et j'ai l'index des sous-chaînes. Ma première idée était d'utiliser re pour trouver toutes les correspondances, puis de déterminer la plage d'index qu'elles représentent.

Il semble que je doive utiliser re avec une expression rationnelle comme \"[^\"]+\"|'[^']+' (pour l'instant, j'évite de traiter les chaînes de caractères à triple guillemets et autres). Lorsque j'utilise findall(), j'obtiens une liste des chaînes correspondantes, ce qui est assez agréable, mais j'ai besoin d'index.

Ma sous-chaîne peut être aussi simple que c et j'ai besoin de savoir si cette c est effectivement cité ou non.

221voto

Dave Kirby Points 12310

Voici ce que vous voulez : ( source )

re.finditer(pattern, string[, flags]) 

Retourne un itérateur produisant un MatchObject dans correspondances non chevauchantes pour le motif RE dans la chaîne de caractères. La chaîne est balayée de gauche à droite, et les correspondances sont renvoyées dans l'ordre où elles ont été trouvées. Les correspondances sont incluses dans le résultat à moins qu'elles ne touchent le début d'une autre chaîne. d'une autre correspondance.

Vous pouvez ensuite obtenir les positions de départ et d'arrivée à partir des MatchObjects.

par exemple

[(m.start(0), m.end(0)) for m in re.finditer(pattern, string)]

3voto

Be Champzz Points 67

Pour obtenir un index de toutes les occurrences :

S = input() # Source String 
k = input() # String to be searched
import re
pattern = re.compile(k)
r = pattern.search(S)
if not r: print("(-1, -1)")
while r:
    print("({0}, {1})".format(r.start(), r.end() - 1))
    r = pattern.search(S,r.start() + 1)

1voto

Omkar Rahane Points 86

Cela devrait résoudre votre problème :

pattern=r"(?=(\"[^\"]+\"|'[^']+'))"

Utilisez ensuite la méthode suivante pour obtenir tous les indices qui se chevauchent :

indicesTuple = [(mObj.start(1),mObj.end(1)-1) for mObj in re.finditer(pattern,input)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X