繁体   English   中英

正则表达式和转义序列

[英]Regular Expression and escape sequences

我有一个文件,其中包含要在db中查找的正则表达式列表。

这样的模式之一是(/|\\)cmd\\.com$ 但是,当我将其与re模块一起使用时,它会引发以下错误。 如果我将re模式用作(/|\\\\\\\\)cmd\\.com$ ,则可以使用。

因此,问题是当我从文件中读取EX的变量时:a,如何将其转换为带有四个反斜杠的reg模式,以便它开始与python re模块一起工作。

另外,当将reg模式分配给变量EX:“ a”时,我们如何转义此类转义序列。

在这方面的任何帮助表示赞赏。

import re
a='(/|\)cmd\.com$'
re.compile(a)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/re.py", line 190, in compile
    return _compile(pattern, flags)
  File "/usr/lib/python2.6/re.py", line 245, in _compile
    raise error, v # invalid expression
sre_constants.error: unbalanced parenthesis

桑索斯(Ththo)

首先请注意,您原来的正则表达式无效。 它应该是(/|\\\\)cmd\\.com$ 如果这样的字符串来自数据库(或代码中字符串文字以外的任何其他来源),则在regex引擎看到它之前不需要执行其他任何操作-斜杠是正确的。

详细信息和解释:

反斜杠的特殊之处在于它们可以转义其他字符并赋予它们不同的含义。

a = '(/|\)cmd\.com$'

在此正则表达式中, )是特殊的,表示分组表达式的结尾; 反斜杠将其转义以使其解释为原义) ,这不是您想要的(以及为什么会出现括号不匹配的错误)。

您需要转义反斜杠以将其解释为文字\\ 这可以使用另一个反斜杠来完成:

a = '(/|\\)cmd\.com$'

但是,即使这样也行不通,因为在Python中正在进行两级处理(因此需要两级转义):首先,对字符串文字进行求值,并特别对反斜杠进行解释(例如,按字符串排序) \\.没有意义,因此计算为\\. \\\\但是\\\\计算为\\ 然后,当正则表达式引擎获取字符串时,它会特别解释对象中的所有文字反斜杠(在正则表达式方面,例如\\.使.文字代替“任何字符”)。 因此,您最终得到:

a = '(/|\\\\)cmd\\.com$'    # Escaped version of (/|\\)cmd\.com$ which is what regex engine will see

因为这个问题非常普遍,所以Python提供了一种编写字符串的方式,使得在字符串处理阶段不对反斜杠进行特殊处理: “ raw”字符串文字

a = r'(/|\\)cmd\.com$'    # backslashes here will be interpreted as literal \ characters

正则表达式引擎仍将特别地解释字符串中的反斜杠(原始字符串只是编写文字的一种方式;它仍然会产生纯str对象)。

在上面的示例中,您需要使regex模式成为Python“原始”字符串,如下所示:

  re.compile(r'put the pattern here')

如果您发布代码,我也许可以帮助您解决有关从文件中加载模式的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM