web-dev-qa-db-fra.com

Trouver les index de toutes les correspondances d'expression régulière?

J'analyse des chaînes qui pourraient contenir un nombre quelconque de chaînes entre guillemets (j'analyse le 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 pensée initiale était d'utiliser re pour trouver toutes les correspondances, puis déterminer la plage d'index qu'elles représentent.

Il semble que je devrais utiliser re avec une expression régulière comme \"[^\"]+\"|'[^']+' (J'évite de traiter les chaînes entre guillemets triples et ces chaînes pour le moment). Lorsque j'utilise findall (), j'obtiens une liste des chaînes correspondantes, ce qui est plutôt sympa, mais j'ai besoin d'index.

Ma sous-chaîne peut être aussi simple que c, et je dois déterminer si ce c particulier est réellement cité ou non.

55
xitrium

Voici ce que vous voulez: ( source )

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

Renvoie un itérateur produisant des instances MatchObject sur toutes les correspondances qui ne se chevauchent pas pour le modèle RE dans la chaîne. La chaîne est analysée de gauche à droite et les correspondances sont renvoyées dans l'ordre trouvé. Les correspondances vides sont incluses dans le résultat, sauf si elles touchent le début d'une autre correspondance.

Vous pouvez ensuite obtenir les positions de début et de fin à partir des MatchObjects.

par exemple.

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