Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个python正则表达式是什么意思;([\w\/%]*)”;_Python_Regex - Fatal编程技术网

这个python正则表达式是什么意思;([\w\/%]*)”;

这个python正则表达式是什么意思;([\w\/%]*)”;,python,regex,Python,Regex,我正在阅读Shinken/misc/perfdata.py中的Shinken源代码,最终找到了一个我无法理解的正则表达式。像这样: metric_pattern = re.compile('^([^=]+)=([\d\.\-\+eE]+)([\w\/%]*);?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE]+)?;?([\d\.\-\+eE]+)?;?\s*') 让我困惑的是,\/在([\w\/%]*)中的意思是什么?您有理由感到

我正在阅读Shinken/misc/perfdata.py中的Shinken源代码,最终找到了一个我无法理解的正则表达式。像这样:

metric_pattern = re.compile('^([^=]+)=([\d\.\-\+eE]+)([\w\/%]*);?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE:~@]+)?;?([\d\.\-\+eE]+)?;?([\d\.\-\+eE]+)?;?\s*')

让我困惑的是,
\/
([\w\/%]*)
中的意思是什么?

您有理由感到困惑,因为正则表达式一定是由不熟悉Python正则表达式的人编写的

在某些语言(如JavaScript)中,正则表达式由斜杠分隔。这意味着,如果您需要在正则表达式中使用实际的斜杠,您必须避开它。由于Python不使用斜杠,因此不需要转义斜杠(但也不会导致错误)

更令人担忧的是,作者未能使用原始字符串。在许多情况下,这并不重要(因为Python会将
“\d”
视为
“\\d”
,然后正确地转换为正则表达式
\d
,但在其他情况下,这会导致问题。一个例子是
“\b”
,意思是“退格字符”,而不是像正则表达式
\b
那样的“a”

此外,作者还转义了许多根本不需要转义的字符。整个正则表达式可以重写为

metric_pattern = re.compile(r'^([^=]+)=([\d.+eE-]+)([\w/%]*);?([\d.+eE:~@-]+)?;?([\d.+eE:~@-]+)?;?([\d.+eE-]+)?;?([\d.+eE-]+)?;?\s*')

即使如此,我还是很惊讶它居然能工作。在我看来,它看起来非常混乱,绝对不是万无一失的。例如,用户可能会用恶意输入冻结服务器。这是一个字面正斜杠。它被反斜杠转义。它将导致匹配一个字面
/
是无用的,因为正斜杠在字符类中不需要转义。(在Python中)使用我的解释工具@Lix,我认为为了匹配
/
,没有必要转义它。因为它不是一个特殊的字符。更让我困惑的是Python没有警告过这种错误用法(在我看来)。嗯,这没有错(语法是合法的),Python也不知道您是想写
“\b”
还是
“\\b”
。如果字符串包含实际的语法错误,Python会抱怨,但当前的正则表达式很笨拙,可能效率低下,不是非法的。@Time Pietzcker,我的意思是
\/
的使用可能是非法的。@andy:不是真的。大多数正则表达式引擎忽略不必要的转义字符,如
\/
,但也有一些例外。我IRC、.NET在这里要严格一点;另外,一些正则表达式引擎有特殊的转义,如
\非常感谢您的解释。@Tim Pietzcker,