我正在shinken / misc / perfdata.py中阅读Shinken源代码,我终于找到了一个我无法理解的正则表达式。像这样:
metric_pattern = re.compile('^([^=]+)=([\d\.\-\+eE]+)([\w\/%]*);?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE]+)?;?([\d\.\-\+eE]+)?;?\s*')
让我感到困惑的是\/
中([\w\/%]*)
的含义是什么?
答案 0 :(得分:7)
你理所当然地混淆了,因为那个正则表达式一定是由一个不熟悉Python正则表达式的人编写的。
在某些语言(例如JavaScript)中,正则表达式由斜杠分隔。这意味着如果你的正则表达式需要一个实际的斜杠,你必须逃避它。由于Python不使用斜杠,因此无需转义斜杠(但也不会导致错误)。
更令人担忧的是作者未能使用原始字符串。在许多情况下,这无关紧要(因为Python会将"\d"
视为"\\d"
然后正确转换为正则表达式\d
,但在其他情况下,它会导致问题。是"\b"
,这意味着“退格字符”,而不是像正则表达式\b
那样的“word boundary anchor”。
此外,作者已经逃脱了许多根本不需要转义的角色。整个正则表达式可以重写为
metric_pattern = re.compile(r'^([^=]+)=([\d.+eE-]+)([\w/%]*);?([\d.+eE:~@-]+)?;?([\d.+eE:~@-]+)?;?([\d.+eE-]+)?;?([\d.+eE-]+)?;?\s*')
即便如此,我很惊讶它的功能完全正常。对我来说看起来很混乱,绝对不是万无一失的。例如,catastrophic backtracking似乎有很大的潜力,这意味着用户可能会使用恶意输入冻结您的服务器。