我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>
如果您不需要正则表达式,而只想测试模式是否是字符串的子字符串,请使用:
if pattern in string:
如果要在字符串的开头或结尾进行测试:
if string.startswith(pattern): # or .endswith(pattern)
有关其他字符串方法,请参阅文档的字符串方法部分。
如果您需要知道字符串中子字符串的所有位置,请使用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
在字符串上使用。这将返回“needle”字符串第一次出现的索引(或者-1
如果它没有找到)。例如
>>> a = 'test string 1+2*3'
>>> a.find('str')
5
>>> a.find('not there')
-1
>>> a.find('1+2*')
12