正则表达式Python排除了一些结果

正则表达式Python排除了一些结果,python,regex,abstract-syntax-tree,parse-tree,Python,Regex,Abstract Syntax Tree,Parse Tree,有一个测试字符串: 模块([Assign([Name('a',Store())]),Num(2)),Assign([Name('b'), Store()),Num(3)),Assign([Name('c',Store())],Str('Hello')), 赋值([Name('x',Store())]、BinOp(Name('a',Load())、Add()、Name('b'), 加载())),分配([Name('x',Store())],Name('a',Load()), Expr(调用(名称(

有一个测试字符串:

模块([Assign([Name('a',Store())]),Num(2)),Assign([Name('b'), Store()),Num(3)),Assign([Name('c',Store())],Str('Hello')), 赋值([Name('x',Store())]、BinOp(Name('a',Load())、Add()、Name('b'), 加载())),分配([Name('x',Store())],Name('a',Load()), Expr(调用(名称('print',Load()),[Name('a',Load())],[],无, 无),For(Name('i',Store()),Call(Name('range',Load()),[Num(10)], [],无,无),[Expr(Call(Name('print',Load()),[Name('a',), 加载())],[],无,无],[]))

我试图从中获取所有加载的变量名。我的regexp是

[a-z]+(?=', Load)
结果如下: 如您所见,它还可以查找内置模块,如打印、范围。如何排除它们?要排除的值前面有

Call(Name(' 
我试过了

 (?=Call\(Name\(')[a-z]+(?=', Load)
但它没有成功

我的代码是:

import re

test = '''Module([Assign([Name('a', Store())], Num(2)), Assign([Name('b', Store())], Num(3)), Assign([Name('c', Store())], Str('Hello')), Assign([Name('x', Store())], BinOp(Name('a', Load()), Add(), Name('b', Load()))), Assign([Name('x', Store())], Name('a', Load())), Expr(Call(Name('print', Load()), [Name('a', Load())], [], None, None)), For(Name('i', Store()), Call(Name('range', Load()), [Num(10)], [], None, None), [Expr(Call(Name('print', Load()), [Name('a', Load())], [], None, None))], [])])'''
print(re.findall(r"[a-z]+(?=', Load)", test))
print(re.findall(r"(?=Call\(Name\(')[a-z]+(?=', Load) ", test))
负面回顾:

(?<!Call\(Name\()'(\w+)(?=', Load)
(?
或

(?一种消极的后视:

(?<!Call\(Name\()'(\w+)(?=', Load)
(?
或


(?使用
lookback
单词边界

(?<!Call\(Name\(')\b\w+\b(?=', Load)
(?
见演示


使用
后视
单词边界

(?<!Call\(Name\(')\b\w+\b(?=', Load)
(?
见演示

我使用了
eval()
方法。我不建议使用这种方法,但您可以使用它作为替代方法

这里的
test
是具有长字符串的变量。
filtered
变量具有所需的值列表

all = (re.findall(r"[a-z]+(?=', Load)", test))

filtered = []
for each in all:
    try:
        eval(each)
    except NameError:
        filtered.append(each)
    except:
        pass

print filtered
输出:

['a', 'b', 'a', 'a', 'a']
我们尝试使用eval()方法执行每个字符串。如果没有任何具有该名称的变量、方法或类,python解释器将抛出NameError异常,表明这不是一个方法或变量,因此我们将字符串追加/添加到筛选列表中

注:任何其他异常(如
TypeError
)都会被传递。

我已经为此使用了
eval()
方法。我不建议使用这种方法,但您可以使用它作为替代方法

这里的
test
是具有长字符串的变量。
filtered
变量具有所需的值列表

all = (re.findall(r"[a-z]+(?=', Load)", test))

filtered = []
for each in all:
    try:
        eval(each)
    except NameError:
        filtered.append(each)
    except:
        pass

print filtered
输出:

['a', 'b', 'a', 'a', 'a']
我们尝试使用eval()方法执行每个字符串。如果没有任何具有该名称的变量、方法或类,python解释器将抛出NameError异常,表明这不是一个方法或变量,因此我们将字符串追加/添加到筛选列表中


PS.任何其他异常,如
TypeError
,都会被传递。

这看起来像一个解析树。出于无数原因,我不会使用正则表达式,其他人在一些漂亮的例子中解释得更好(尽管post使用[x]html,但教训仍然存在,不要使用正则表达式解析更复杂的语法)

我的理解是,AST和在本例中实际的具体解析树使用上下文无关语法,因此不是正则的,无法使用正则表达式可靠地解析。此外,该代码在遍历能力方面已经处于非常方便的状态。如果有什么需要,请在知道规则的情况下重新创建对象并遍历树变量名称将是
Assign
语句的左侧终端,其值位于右侧。这肯定会比使用正则表达式花费更少的时间,也不会引起更多的麻烦

帮你自己一个忙,不要尝试使用正则表达式,除非你正在处理一小部分已知的正则表达式


对于。

这看起来像一个解析树。出于无数原因,我不会使用regex,其他人在一些漂亮的文章中解释得更好(尽管post使用[x]html,但教训仍然是,不要使用正则表达式解析更复杂的语法)

我的理解是,AST和在本例中实际的具体解析树使用上下文无关语法,因此不是正则的,无法使用正则表达式可靠地解析。此外,该代码在遍历能力方面已经处于非常方便的状态。如果有什么需要,请在知道规则的情况下重新创建对象并遍历树变量名称将是
Assign
语句的左侧终端,其值位于右侧。这肯定会比使用正则表达式花费更少的时间,也不会引起更多的麻烦

帮你自己一个忙,不要尝试使用正则表达式,除非你正在处理一小部分已知的正则表达式


对于。

请显示您的完整代码。您不应该为此使用正则表达式。它已经是最理想的形式,能够遍历它来查找您要查找的任何元素。虽然这里的答案可以准确地从提供的特定示例中提取您要查找的数据,但没有正则表达式能够可靠地做到这一点。请检查下面是我的答案。请展示您的完整代码。您不应该为此使用正则表达式。它已经是最理想的形式,能够遍历它来查找您要查找的任何元素。虽然这里的答案可以准确地从提供的特定示例中提取您要查找的数据,但没有正则表达式能够可靠地做到这一点。Che请核对我下面的答案。非常感谢。是的,它确实是一个AST。我正在尝试使用内置的Python AST模块来查找初始化了哪些变量(例如a=4)但是没有在代码中使用。我的想法是从AST转储中获取此信息,因为使用的变量在那里被标记为已加载。@trthhrtz我没有使用AST模块,但我认为它必须提供一种遍历树的方法,这可能就是您想要的want@trthhrtz而且,这听起来像是一个好的linter会处理的事情。一定有一条python这是一个类似的包,无论你是想要这个功能,还是只是想偷偷看看其他人是如何处理这个问题的。非常感谢。是的,它确实是一个AST。我正在尝试使用内置的Python AST模块来查找哪些变量已初始化(例如a=4),但没有在代码中使用。我的想法是