3

假设我有一个字符串

x = "spam ?and eggs"

我正在尝试匹配它"?and"。目前我正在这样做:

>>> print re.findall(re.escape('?and'), x)
['?and']

这是正确的用例re.escape吗?它是否可以与我正在寻找的任何其他字符串文字一起使用,其中可能包含其他类型的正则表达式语法?

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

4

3 回答 3

6

是的,这正是正确的用例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
于 2012-03-15T02:22:34.410 回答
2

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

从文档:

expect_exact (self, pattern_list, timeout=-1, searchwindowsize=-1)
这类似于expect(),但在'pattern_list'中使用纯字符串匹配而不是编译的正则表达式。'pattern_list' 可能是一个字符串;一个列表或其他字符串序列;或超时和EOF。

此调用可能比 expect() 更快,原因有两个:字符串搜索比 RE 匹配更快,并且可以将搜索限制在输入缓冲区的末尾。

当您不想担心转义要匹配的正则表达式字符时,此方法也很有用。

于 2012-06-07T01:23:29.480 回答
0

是的,在我看来是对的。如果您要逃避整个模式,这通常是一个很好的迹象,您应该在find没有正则表达式的情况下使用。

x.find('?and')

它给出 -1 或位置。所以...

>>> if x.find('?and') != -1: 
...   print "Match!"
... 
Match!
于 2012-03-15T02:25:58.833 回答