Python 如何匹配包含regexy语法的字符串?

Python 如何匹配包含regexy语法的字符串?,python,regex,pexpect,Python,Regex,Pexpect,假设我有一根像 x = "spam ?and eggs" 我正在尝试匹配“?和”。目前我是这样做的: >>> print re.findall(re.escape('?and'), x) ['?and'] 这是re.escape的正确用例吗?它是否可以与我正在寻找的任何其他字符串文字一起工作,其中可能包含其他类型的正则表达式语法 我的用例使用pexpect.spawn.expect(pattern)中的参数,其中输入模式可以是一种字符串类型,可以编译成正则表达式。在某些情况

假设我有一根像

x = "spam ?and eggs"
我正在尝试匹配
“?和”
。目前我是这样做的:

>>> print re.findall(re.escape('?and'), x)
['?and']
这是
re.escape
的正确用例吗?它是否可以与我正在寻找的任何其他字符串文字一起工作,其中可能包含其他类型的正则表达式语法


我的用例使用
pexpect.spawn.expect(pattern)
中的参数,其中输入模式可以是一种字符串类型,可以编译成正则表达式。在某些情况下,我搜索的内容可能看起来像一个正则表达式,但实际上它是我想要匹配的字符串文本

是的,对于
re.escape
,这正是正确的用例。它说“如果您想匹配可能包含正则表达式元字符的任意文字字符串,那么它很有用”——尽管在您的第一个示例中,我认为自己使用以下任何一种方法来摆脱问号更简单:

re.findall(r'\?and', x)          # \? in a raw string literal
re.findall('\\?and', x)          # \? in a non-raw string literal, so, \\?
re.findall('[?]and', x)          # "cheat" by using a character class

是的,我觉得很对。如果您正在逃避整个模式,那么这通常是一个很好的指示,表明您应该在不使用正则表达式的情况下使用
find

x.find('?and')
它给出-1或位置。所以

>>> if x.find('?and') != -1: 
...   print "Match!"
... 
Match!

对于pexpect,您可以使用expect_exact()而不是expect()来禁用regex功能,它将与您提供给它的python字符串完全匹配

从文档中:

期望精确(self,pattern\u list,timeout=-1,searchwindowsize=-1)
这与expect()类似,但使用纯字符串匹配而不是 “模式列表”中已编译的正则表达式。“模式列表”可能 成为一根绳子;字符串的列表或其他序列;或超时和EOF。

此调用可能比expect()快,原因有两个:string 搜索比重新匹配快,并且可以限制 只搜索到输入缓冲区的末尾。

此方法也适用 当你不想担心逃逸的时候很有用 要匹配的表达式字符


是的,我通常只在中使用
,比如在bigstring中使用
子字符串。但是我必须使用pexpect接口。谢谢。为什么转义本身只提供一个反斜杠,而使用
re.escape
则提供一个双斜杠?这种差异有什么意义吗?我将使用re.escape,因为实际上我不知道我要找的子字符串是什么(它可以是任何东西)。@wim:我自己只需要一个反斜杠,因为我搞砸了,应该写
r'\?和'
(指定一个“原始”字符串文字)或
'\\\?和'
(这表示包含
\?和
的字符串,这依次表示匹配问号加上
的正则表达式).
re.escape
显示了两个反斜杠,因为它生成了包含
\?和
的字符串,Python的REPL pretty printing将其转换回可以在Python程序中使用的形式,即
'\\?和'
@wim:我已经更新了我的答案,以减少错误(并且更加完整).@ruakh:事实上,'\'和'在这种情况下与r'\'和'。@EduardoIvanec:*检查*你是对的,
'\?'==r'\?'='\\?'
。很高兴知道这一点,谢谢!但不知何故,我觉得最好使用
r
\
,因为
\
在字符串文字中通常是有意义的。