我用re.findall(p, text)
为大致匹配的模式,但现在我遇到了一个问题:如何逃避字符串中的特殊正则表达式字符?
我只想p
进行匹配作为一个正常的字符串,而不是正则表达式。
例如:p可能包含'+'或'*',我不希望这些字符在正则表达式中有特殊含义。换句话说,我希望p是逐字符匹配的。
在这种情况下,p
对我来说是未知的,所以我不能在其中添加'\'来忽略特殊字符。
我用re.findall(p, text)
为大致匹配的模式,但现在我遇到了一个问题:如何逃避字符串中的特殊正则表达式字符?
我只想p
进行匹配作为一个正常的字符串,而不是正则表达式。
例如:p可能包含'+'或'*',我不希望这些字符在正则表达式中有特殊含义。换句话说,我希望p是逐字符匹配的。
在这种情况下,p
对我来说是未知的,所以我不能在其中添加'\'来忽略特殊字符。
您可以使用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>
我想使用re.findall(),所以我认为re.escape()最适合我! :) – 2012-04-04 14:43:01
@朱胜奇:为了寻找一个逐字字符串,'re.findall()'实际上是无用的; 'res.findall(“ab”,“abcabcabc”)'产生'[“ab”,“ab”,“ab”]'。你可能需要'str.count()'。 – 2012-04-04 14:44:56
@朱:是的,如果你不需要*正则表达式,不要使用它们。 (a)你想把'p'集成到更复杂的正则表达式中(b)你想匹配正则表达式列表,其中一些只是纯文本搜索,而另一些则更为复杂。 – 2012-04-04 14:46:34
如果哟你不需要一个正则表达式,而只是想测试,如果该模式是一个字符串的子串,使用:
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)
您可以在字符串使用.find
。这将返回“针”字符串首次出现的索引(如果未找到,则返回-1
)。例如
>>> a = 'test string 1+2*3'
>>> a.find('str')
5
>>> a.find('not there')
-1
>>> a.find('1+2*')
12
如果你不知道'p',你怎么能把它用作正则表达式? – Marcin 2012-04-04 14:36:01
@Marcin:他没有关于'p'的先验信息,所以他无法对已经转义的字符串进行硬编码。不明白为什么这是downvoted? – 2012-04-04 14:36:40
@NiklasB。好吧,也许,但为什么他不能逃脱特殊字符,如果他有字符串? – Marcin 2012-04-04 14:38:18