2010-04-09 6 views
4

Je cherche une regex pour rechercher mon programme python pour trouver toutes les lignes où foo, mais pas bar, est passé dans une méthode en tant qu'argument de mot-clé. Je joue avec des assertions lookahead et lookbehind, mais sans avoir beaucoup de chance.Regex pour trouver A et non B sur une ligne

Une aide?

Merci

Répondre

5

Si vous avez une chaîne foo que vous voulez trouver et une autre chaîne bar qui ne doit pas être présent, vous pouvez utiliser ceci:

^(?!.*bar).*foo 

Création d'une expression régulière qui répond exactement à tous vos exigences sont très difficiles car le code Python n'est pas un langage régulier, mais j'espère que vous devriez pouvoir l'utiliser comme point de départ pour obtenir quelque chose de suffisamment bon pour vos besoins.

+0

Je suis assez confiant toutes les occurrences sont sur la même ligne, et si je manque certains, il n » t importe. Je viens de mentionner python pour donner un peu de contexte. Cela fonctionne – Zach

+0

... merci ..... + 1 et sélectionné comme correct – Zach

+0

@Zach, ce que Mark voulait dire est que la chaîne 'bar' pourrait se produire sans être un mot-clé (ou avez-vous dire identifiant?): Il pourrait être à l'intérieur d'une chaîne littérale ou d'une partie d'un commentaire. –

2

Ayant le ^après les lookaheads dans ces scénarios semble toujours mieux fonctionner pour moi. La lecture a plus de sens pour moi aussi.

(?!.*bar)^.*foo

this has a foo   # pass 
so does this has a foo # pass 
i can haz foo   # pass 
but i haz foo and bar! # fail 
+0

Pourriez-vous poster une chaîne qui fonctionne "mieux" lorsque vous placez le '^' après lui au lieu d'avant? –

+0

Merci ... + 1 mais vous avez battu à temps – Zach

+0

Gros accessoires pour cela, python regex frustrant résolu. Essayait de trouver tous les fichiers d'un certain nom mais excluait tous les fichiers de sauvegarde tilde. (?!. * ~) ^. * Filename.ext – Halsafar

2

Vous pouvez aussi le faire avec pas regex:

for line in file: 
    if "foo" in line and "bar" not in line: 
     #do something 
+0

Je suis à la recherche par le biais de fichiers de sorte qu'il est beaucoup plus facile d'utiliser simplement un outil qui prend une expression régulière et gère le déplacement des fichiers pour moi. Merci bien – Zach

+0

Bien sûr. J'adore les regex et je les utilise tous les jours. Il est juste valeur compte tenu du fait que, parfois, vous devez simplement indiquer au programme exactement ce que vous voulez et vous épargner des maux de tête. ;) – Ipsquiggle