如何在字符串中转义特殊的正则表达式字符?

时间:2012-04-04 14:34:22

标签: python regex string

我一般使用re.findall(p, text)来匹配模式,但现在我遇到了一个问题:

我只想将p匹配为普通字符串,而不是正则表达式。

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

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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)

答案 2 :(得分:0)

您可以在字符串上使用.find。这将返回“needle”字符串的第一个出现的索引(如果未找到,则返回-1)。 e.g。

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