在正则表达式中否定部分

4

我正在尝试构建正则表达式,以便在Python代码中查找类,而无需显式继承自object

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:'

正则表达式可视化

Debuggex演示

但我只需要'class Test:'

同时正向预查起作用:

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

这里的问题是什么?

为什么要使用正则表达式而不是ast?使用正则表达式更容易出现错误。 - Bharel
@Bharel 只是从 Github 存储库中收集一些统计数据。 - xiº
@xi 嗯,这有点棘手,因为你无法区分 class test: ..."class test: ...". 任何在注释、字符串或文档字符串中的数据也会被计算在内 :-/ - Bharel
@Bharel 很好的观点。 - xiº
1个回答

2
你需要在"class "后面使用负向预查(?!.*\(object\))
class (?!.*\(object\)).*

请查看正则表达式演示
子模式.*(?!\(object\)).*匹配除换行符外的任意0个或多个字符,但不包括后面跟着的(object)。它有效地获取所有直到末尾的行,并且在其后没有找到任何(object)。第二个.*甚至不匹配任何内容,因为所有字符已经“属于”第一个.*
(?!.*\(object\))中,在消耗class+空格后进行检查,如果当前行上有(object),则匹配失败。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接