如何匹配具有regexy语法的字符串?

时间:2012-03-15 02:20:11

标签: python regex pexpect

假设我有一个像

这样的字符串
x = "spam ?and eggs"

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

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

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

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

3 个答案:

答案 0 :(得分:6)

是的,这正是re.escape的正确用例 - the documentation说它“非常有用,如果你想匹配一个可能有正则表达式元字符的任意文字字符串” - 尽管如此你的第一个例子我认为使用以下任何一个来逃避问号更简单:

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

答案 1 :(得分:2)

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

来自文档:

  

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

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

这种方法也是   当你不想担心逃避常规时很有用   要匹配的表达式字符。

答案 2 :(得分:0)

是的,它对我来说是正确的。如果您正在逃避整个模式,那么通常情况下,您应该使用find而不使用正则表达式。

x.find('?and')

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

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