pythonre:对正则表达式的一部分求反

2024-10-01 15:40:54 发布

您现在位置:Python中文网/ 问答频道 /正文

这也许是个愚蠢的问题,但尽管google返回了许多类似的情况,但我找不到这个确切的情况:什么正则表达式将匹配所有不包含特定字符串的字符串。例如,我想匹配任何不包含“foo”的字符串。 现在

 re.match('(?<!foo_).*', 'foo_bar') 

返回匹配项。同时

^{pr2}$

没有。 我尝试了非贪婪的版本:

 re.match('(?<!foo_).*?', 'foo_bar')

仍然返回匹配项。 如果我在后面添加更多字符)

re.search('(?<!foo_)b.*', 'foo_bar')

它返回None,但是如果目标字符串有更多的尾随字符:

re.search('(?<!foo_)b.*', 'foo_barbaric')

它返回匹配项。 我故意不写首字母。*或.*?在re。但同样的事情也会发生。在

你知道为什么会有这种奇怪的行为吗?(我需要它作为一个正则表达式-作为用户输入输入输入)。在


Tags: 字符串版本renone目标searchfoomatch
3条回答

请尝试以下模式:

^(?!.*foo_).*

这将使用^元字符从字符串的开头开始匹配,然后使用一个否定的先行检查“foo”。如果存在,匹配将失败。在

由于您给出了同时使用re.match()re.search()的示例,因此上述模式可以同时使用这两种方法。但是,在使用re.match()时,可以安全地省略^元字符的用法,因为它将在字符串的开头匹配,而与匹配字符串中任何位置的re.search()不同。在

在需要前瞻断言的情况下,使用lookbehind断言:

re.match(r"(?!.*foo_).*", "foo_bar")

会工作(即不匹配)。在

(?!.*foo_)表示“断言无法从字符串中的当前位置匹配.*foo_”。由于使用的是re.match(),因此该位置被自动定义为字符串的开始。在

我觉得很有可能你可以用一个条件语句来设计。在

(如果我们能明确知道你想要完成什么,那就太好了)。在

为什么不:

if not re.match("foo", something):
    do_something
else:
    print "SKipping this"

相关问题 更多 >

    热门问题