views:

89

answers:

3

I'm looking for a regex to search my python program to find all lines where foo, but not bar, is passed into a method as a keyword argument. I'm playing around with lookahead and lookbehind assertions, but not having much luck.

Any help?

Thanks

+3  A: 

If you have a string foo that you want to find and another string bar that must not be present, you can use this:

^(?!.*bar).*foo

Creating a regular expression that exactly meets all your requirements is very difficult as Python code is not a regular language, but hopefully you should be able to use this as a starting point to get something good enough for your needs.

Mark Byers
I'm fairly confident all the occurrences are on the same line, and if I miss some it doesn't matter. I just mentioned python to give some context.
Zach
This works...thanks.....+1 and selected as correct
Zach
@Zach, what Mark meant is that the string `bar` could occur without being a keyword (or did you mean identifier?): it could be inside a string literal or part of a comment.
Bart Kiers
+1  A: 

Having the ^ after the lookaheads in these scenarios always seems to work better for me. Reading it makes more sense to me, too.

(?!.*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
macek
Could you post a string that works "better" when placing the `^` after it instead of before?
Bart Kiers
Thanks...+1 but you got beat on time
Zach
+2  A: 

You could also do this with not a regex:

for line in file:
    if "foo" in line and "bar" not in line:
        #do something
Ipsquiggle
I'm searching through many files so it's much easier to just use a tool that takes a regular expression and handles the traversing of files for me. Thanks though
Zach
For sure. I love regexes and use them daily. It's just worth bearing in mind that sometimes, you should just tell the program exactly what you want and save yourself a headache. ;)
Ipsquiggle