2017-08-08 3 views
0

J'ai une expression régulière (voir this question) utilisée pour faire correspondre les définitions de fonctions C dans un fichier texte. En particulier, je travaille sur une sortie git diff.Comment faire correspondre les caractères au début d'une expression régulière complexe en Python?

f = open(input_file) 
diff_txt = ''.join(f.readlines()) 
f.close 

re_flags = re.VERBOSE | re.MULTILINE 
pattern = re.compile(r""" 
         (^[^-+]) # Problematic line: Want to ensure we do not match lines with +/- 
         (?<=[\s:~]) 
         (\w+) 
         \s* 
         \(([\w\s,<>\[\].=&':/*]*?)\) 
         \s* 
         (const)? 
         \s* 
         (?={) 
         """, 
         re_flags) 

input file est une partie de la sortie git diff brute générée de la manière habituelle:

git diff <commit-sha-1> <commit-sha-2> > tmp.diff 

La première ligne (^[^-+]) dans ma chaîne regex est problématique. Sans cette ligne, la regex va correspondre avec toutes les fonctions C/C++ dans input_file, mais avec elle, rien ne correspond. J'ai besoin de cette ligne parce que je wan't d'exclure les fonctions qui ont été ajoutées ou supprimées entre les deux révisions du dépôt, et les lignes qui sont ajoutés et supprimés sont identifiés comme

+ [added line] 
- [removed line] 

J'ai lu les documents et je peux » Je semble trouver où mon erreur est, une aide serait très appréciée.

Répondre

0

- et + sont des caractères spéciaux dans les expressions régulières. Essayez-les sortir avec des barres obliques - [^ \ - \ +]

+1

Je suis sur mon téléphone maintenant, donc je ne peux pas vous donner un lien vers la documentation, mais si vous le lisez, il est clairement indiqué que les caractères spéciaux perdent leur signification spéciale lorsqu'ils sont placés entre crochets, '[.. .] '. Cependant, si '^' est le premier caractère entre crochets, tous les caractères qui ne sont pas entre crochets doivent être appariés. – UnchartedWaters

0

Voir this question

changer simplement la ligne problématique

(^[^-+]) 

à

^(?!\+|\-).* 

Comme nous utilisons le négatif opérateur de lookahead ?!, nous devons nous assurer d'inclure le .* à la fin de la ligne, sinon rien ne va correspondre.

+0

Ou '^ (?! [+ -])' ... – Toto