带有\ +?=的正则表达式无法正常工作/转义' +'正如所料

时间:2016-03-01 03:35:33

标签: python regex

我有以下代码:

import re
pattern = r'.className\s*\+?=\s*.*?\+?[\'"](.*?)["\']'
code_str = "if (El.className == 'blue' ) {\nEl.className = 'className20';\n}\n"
re.findall(pattern, code_str)

输出>>> ['blue', 'className20']

我只想要输出['className20']

[更新] 它还需要处理some_strclassName20结合的连接情况。它应该仍然只返回['className20']

code_str2 = "if (El.className == 'blue' ) {\nEl.className = some_str + 'className20';\n}\n"
re.findall(pattern, code_str)

我也试过了。

pattern = r'.className\s*\+{,1}={1}\s*.*?\+?[\'"](.*?)["\']'
pattern = r'.className\s*\+?[=]{1}\s*.*?\+?[\'"](.*?)["\']'

欢迎任何见解。问题似乎是==中出现code_str。我使用的模式过于贪婪。我的理解是\+正在逃避+标志,但我可能是错的。

1 个答案:

答案 0 :(得分:1)

为什么在.*?之后有=\s*?你想允许任何东西遵循等于后跟任意数量的空间吗?这就是允许== 'blue'被接受的原因; \s*不执行任何操作,但以下.*?与第一个=后面的=匹配。放下它,它可以工作:

import re
pattern = r'.className\s*\+?=\s*\+?[\'"](.*?)["\']'
code_str = "if (El.className == 'blue' ) {\nEl.className = 'className20';\n}\n"
re.findall(pattern, code_str)

按预期生成['className20']。问题是是否有某些理由允许任意字符存在。