2012-04-04 80 views
0

我用re.findall(p, text)为大致匹配的模式,但现在我遇到了一个问题:如何逃避字符串中的特殊正则表达式字符?

我只想p进行匹配作为一个正常的字符串,而不是正则表达式。

例如:p可能包含'+'或'*',我不希望这些字符在正则表达式中有特殊含义。换句话说,我希望p是逐字符匹配的。

在这种情况下,p对我来说是未知的,所以我不能在其中添加'\'来忽略特殊字符。

+0

如果你不知道'p',你怎么能把它用作正则表达式? – Marcin 2012-04-04 14:36:01

+1

@Marcin:他没有关于'p'的先验信息,所以他无法对已经转义的字符串进行硬编码。不明白为什么这是downvoted? – 2012-04-04 14:36:40

+0

@NiklasB。好吧,也许,但为什么他不能逃脱特殊字符,如果他有字符串? – Marcin 2012-04-04 14:38:18

回答

10

您可以使用re.escape

>>> p = 'foo+*bar' 
>>> import re 
>>> re.escape(p) 
'foo\\+\\*bar' 

或者只是使用字符串操作来检查p是另一个字符串中:

>>> p in 'blablafoo+*bar123' 
True 
>>> 'foo+*bar foo+*bar'.count(p) 
2 

顺便说一句,这是如果你想嵌入主要用p合成正确的正则表达式:

>>> re.match(r'\d.*{}.*\d'.format(re.escape(p)), '1 foo+*bar 2') 
<_sre.SRE_Match object at 0x7f11e83a31d0> 
+0

我想使用re.findall(),所以我认为re.escape()最适合我! :) – 2012-04-04 14:43:01

+0

@朱胜奇:为了寻找一个逐字字符串,'re.findall()'实际上是无用的; 'res.findall(“ab”,“abcabcabc”)'产生'[“ab”,“ab”,“ab”]'。你可能需要'str.count()'。 – 2012-04-04 14:44:56

+0

@朱:是的,如果你不需要*正则表达式,不要使用它们。 (a)你想把'p'集成到更复杂的正则表达式中(b)你想匹配正则表达式列表,其中一些只是纯文本搜索,而另一些则更为复杂。 – 2012-04-04 14:46:34

2

如果哟你不需要一个正则表达式,而只是想测试,如果该模式是一个字符串的子串,使用:

if pattern in string: 

如果你想在字符串的开头或结尾,以测试:

if string.startswith(pattern): # or .endswith(pattern) 

有关其他字符串方法,请参阅文档的string methods部分。

如果你需要知道在字符串中的子字符串的所有位置,使用str.find

offsets = [] 
offset = string.find(pattern, 0) 
while offset != -1: 
    offsets.append(offset) 
    # start from after the location of the previous match 
    offset = string.find(pattern, offset + 1) 
0

您可以在字符串使用.find。这将返回“针”字符串首次出现的索引(如果未找到,则返回-1)。例如

>>> a = 'test string 1+2*3' 
>>> a.find('str') 
5 
>>> a.find('not there') 
-1 
>>> a.find('1+2*') 
12