【发布时间】:2017-05-08 15:50:43
【问题描述】:
有一个测试字符串:
Module([Assign([Name('a', Store())], Num(2)), Assign([Name('b', Store())], Num(3)), 赋值([Name('c', Store())], Str('Hello')), 赋值([Name('x', Store())], BinOp(Name('a', Load()), Add(), Name('b', 加载()))),分配([名称('x',存储())],名称('a',加载())), Expr(Call(Name('print', Load()), [Name('a', Load())], [], None, 无)), For(Name('i', Store()), Call(Name('range', Load()), [Num(10)], [], 无, 无), [Expr(Call(Name('print', Load()), [Name('a', 加载())],[],无,无))],[])])
我正在尝试从中获取所有已加载的变量名称。我的正则表达式是
[a-z]+(?=', Load)
结果如下: 如您所见,它还可以找到内置模块,例如 print、range。如何排除它们?要排除的值前面有
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))
【问题讨论】:
-
请出示您的完整代码。
-
您不应该为此使用正则表达式。它已经处于最佳形式,能够步行找到您正在寻找的任何元素。虽然这里的答案可能会准确地从提供的特定示例中提取您寻求的数据,但没有任何正则表达式能够可靠地做到这一点。在下面检查我的答案。
标签: python regex abstract-syntax-tree parse-tree