我有一个文件,其中包含要在db中查找的正则表达式列表。
一个这样的模式是(/|\)cmd\.com$
。但是当我使用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
THX, Santhosh
答案 0 :(得分:3)
首先请注意,您的原始正则表达式无效。它应该是(/|\\)cmd\.com$
。如果这样的字符串来自数据库(或代码中除字符串文字之外的任何其他来源),那么在正则表达式引擎看到它之前不需要进行额外的操作 - 斜杠是正确的。
完整的细节和解释:
反斜杠的特殊之处在于它们可以逃避其他角色并赋予它们不同的含义。
a = '(/|\)cmd\.com$'
在这个正则表达式中,)
是特殊的,表示分组表达式的结束;反斜杠转义它使它被解释为文字)
而不是你想要的(以及为什么你得到关于不匹配的括号的错误)。
您需要转义反斜杠才能将其解释为文字\
;这可以使用另一个反斜杠来完成:
a = '(/|\\)cmd\.com$'
然而,即使这样也行不通,因为在Python中有两个级别的处理正在进行(因此需要两个级别的转义):首先,计算字符串文字,并特别解释反斜杠(字符串方式) ,例如\.
没有意义,因此评估为\.
- 但\\
评估为\
)。然后,当正则表达式引擎获取字符串时,它会特别解释 对象中的任何文字反斜杠(正则表达式,例如\.
使.
字面值而不是“任何字符” “)。所以你最终得到:
a = '(/|\\\\)cmd\\.com$' # Escaped version of (/|\\)cmd\.com$ which is what regex engine will see
因为这个问题很常见,所以Python有一种编写字符串的方法,以便在字符串处理阶段专门处理反斜杠 :"raw" string literals:
a = r'(/|\\)cmd\.com$' # backslashes here will be interpreted as literal \ characters
正则表达式引擎仍然会特别解释字符串中的反斜杠(原始字符串只是编写文字的一种方式;它仍会产生一个普通的str
对象。)
答案 1 :(得分:1)
在上面的示例中,您需要将正则表达式模式设置为Python“原始”字符串,如下所示:
re.compile(r'put the pattern here')
如果您发布代码,我可以帮助您解决有关从文件加载模式的问题。