否定正则表达式的一部分

时间:2016-04-15 10:32:09

标签: python regex

我正在尝试构建正则表达式,以便在没有明确继承object的情况下将类发现到python代码中。

import re

test_string = '''
class Test(object):
    pass

class Test:
    pass
'''

regex = r'class .*(?!\(object\)).*'

re.compile(regex).findall(test_string)

这给了我:

'class Test(object):', 'class Test:'

Regular expression visualization

Debuggex Demo

但我只需要'class Test:'

与此同时,积极的前瞻工作正常:

>>> print regex = r'class .*(?=\(object\)).*'
['class Test(object):']

这里有什么问题?

1 个答案:

答案 0 :(得分:2)

你需要在" class"之后使用(?!.*\(object\))否定前瞻:

class (?!.*\(object\)).*

请参阅regex demo

.*(?!\(object\)).*子模式匹配除了(object)后面的换行符以外的任何0+个字符。它有效地抓住所有行到它的结尾,并且在它之后找不到任何(object)。第二个.*甚至不匹配任何内容,因为所有字符已经"属于"到第一个.*

(?!.*\(object\))中,在使用class +空格后进行检查,一旦当前行的某处有(object),就会失败。