也许是一个愚蠢的问题,但是虽然谷歌返回了很多类似的案例,但我找不到这种确切的情况:正则表达式将匹配包含特定字符串的所有字符串。例如,我想匹配任何不包含'foo_'的字符串。 现在,
re.match('(?<!foo_).*', 'foo_bar')
返回一个匹配项。而
re.match('(?<!foo_)bar', 'foo_bar')
没有。 我尝试了非贪婪的版本:
re.match('(?<!foo_).*?', 'foo_bar')
仍然会返回一个匹配项。 如果我在后面添加更多字符,
re.search('(?<!foo_)b.*', 'foo_bar')
它返回None,但如果目标字符串有更多的尾随字符:
re.search('(?<!foo_)b.*', 'foo_barbaric')
它返回一个匹配项。 我有意保留了最初的。*或。*?在那里。但同样的事情发生在那里。
任何想法为何会出现这种奇怪的行为? (我需要将它作为单个正则表达式 - 作为用户输入输入)。
答案 0 :(得分:3)
你正在使用lookbehind断言,你需要先行断言:
re.match(r"(?!.*foo_).*", "foo_bar")
会起作用(即不匹配)。
(?!.*foo_)
表示“断言无法从字符串中的当前位置匹配.*foo_
。由于您使用的是re.match()
,因此该位置会自动定义为字符串。
答案 1 :(得分:1)
请尝试使用此模式:
^(?!.*foo_).*
这使用^
元字符从字符串的开头匹配,然后使用检查“foo_”的负前瞻。如果存在,则匹配将失败。
由于您使用re.match()
和re.search()
同时提供了示例,因此上述模式适用于这两种方法。但是,当您使用re.match()
时,您可以安全地省略^
元字符的用法,因为它将在字符串的开头匹配,而不像re.search()
匹配字符串中的任何位置。
答案 2 :(得分:1)
我觉得你很有可能只是用条件陈述来设计它。
(如果我们明确知道你想要完成什么,那就太好了。)
为什么不:
if not re.match("foo", something):
do_something
else:
print "SKipping this"