Python 正则表达式和逃逸序列

Python 正则表达式和逃逸序列,python,regex,Python,Regex,我有一个文件,其中包含要在db中查找的正则表达式列表 其中一种模式是(/| \)cmd\.com$。但是当我将它与re模块一起使用时,它抛出了下面的错误。如果我使用re模式作为(/|\\\\\)cmd\.com$,它就可以工作 所以,问题是,当我从文件中读取EX:a的to变量时,如何将其转换为带有四个向后斜杠的reg模式,以便它开始使用python re模块 另外,当reg模式被分配给下面的变量EX:“a”时,我们如何转义这样的转义序列 在此方面的任何帮助都将不胜感激 import re a='

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

其中一种模式是
(/| \)cmd\.com$
。但是当我将它与re模块一起使用时,它抛出了下面的错误。如果我使用re模式作为
(/|\\\\\)cmd\.com$
,它就可以工作

所以,问题是,当我从文件中读取EX:a的to变量时,如何将其转换为带有四个向后斜杠的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
重新导入
a='(/|\)cmd\.com$'
重新编译(a)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/python2.6/re.py”,第190行,编译
返回编译(模式、标志)
文件“/usr/lib/python2.6/re.py”,第245行,在编译中
raise错误,v#表达式无效
sre_constants.error:不平衡括号
Thx,
Santhosh

在上面的示例中,需要将正则表达式模式设置为Python“原始”字符串,如下所示:

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

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

首先请注意,您的原始正则表达式无效。它应该是
(/|\\)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有一种编写字符串的方法,因此在字符串处理阶段不会专门处理反斜杠:


正则表达式引擎仍然会特别解释字符串中的反斜杠(原始字符串只是编写文本的一种方式;它仍然会生成一个普通的
str
对象).

你想匹配什么?我知道这一点,但可能我需要澄清这个问题。假设我有一个正则表达式文件。那么,在open(file,'r')中导入re for items。readlines():re.compile(r items)如何在上面的re.compile语句中将r个项连接在一起。希望这是清楚的。不,re.compile()用于在模式上调用。因此:`import re pattern=re.compile(r'your pattern here')用于打开(文件)中的项。readlines():match=pattern.match(项)if match:pass#Do something`我知道这一点,但可能我需要澄清这个问题。假设我有一个正则表达式文件。因此,为open(file,'r')中的项导入re。readlines():re.compile(r items)我如何在上面的re.compile语句中将r项连接在一起。希望这一点很清楚。@Santhosh:不太清楚您的要求。是否要将正则表达式列表连接到一个大的正则表达式中?如果是这样,则
string=open(file,'r').read().replace('\n','')
应该可以做到这一点。然后,您可以说
re.compile(string)
a = r'(/|\\)cmd\.com$'    # backslashes here will be interpreted as literal \ characters