我正在阅读Shinken /misc/perdata.py中的shinken源代码,我终于找到了一个我无法理解的regex。就像这样:
metric_pattern = re.compile('^([^=]+)=([\d\.\-\+eE]+)([\w\/%]*);?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE]+)?;?([\d\.\-\+eE]+)?;?\s*')令我困惑的是,\/在([\w\/%]*)中的含义是什么?
发布于 2014-10-20 13:58:13
您有理由感到困惑,因为这个regex一定是某个不熟悉Python正则表达式的人编写的。
在某些语言(例如JavaScript)中,正则表达式用斜杠分隔。这意味着,如果你需要在你的正则表达式中的一个实际的斜线,你必须逃避它。因为Python不使用斜杠,所以没有必要转义斜杠(但它也不会导致错误)。
更令人担忧的是,作者没有使用原始字符串。在许多情况下,这并不重要(因为Python将"\d"作为"\\d"来正确地转换为regex \d,但在其他情况下,它会导致问题。一个例子是"\b",它的意思是“backspace字符”,而不是像regex \b那样的“word boundary anchor”。
此外,作者还逃脱了许多根本不需要转义的角色。整个regex可以重写为
metric_pattern = re.compile(r'^([^=]+)=([\d.+eE-]+)([\w/%]*);?([\d.+eE:~@-]+)?;?([\d.+eE:~@-]+)?;?([\d.+eE-]+)?;?([\d.+eE-]+)?;?\s*')即使如此,我还是感到惊讶。在我看来很混乱,绝对不是万无一失的。例如,catastrophic backtracking似乎有很大的潜力,这意味着用户可以用恶意输入冻结您的服务器。
https://stackoverflow.com/questions/26467403
复制相似问题