📅  最后修改于: 2023-12-03 15:40:23.377000             🧑  作者: Mango
有时候需要在一个字符串中查找另一个字符串出现的所有位置,在编写程序时这个功能必须要有。在Python中,我们可以使用find()
函数来查找另一个字符串中第一个出现的位置,但是如果需要找到所有的位置,这个函数就不太方便了。
Python中有一个自带的方法可以实现此功能,即使用re
模块中的finditer()
函数。下面是一个简单的示例程序:
import re
s = 'hello world, world is beautiful!'
p = 'world'
for m in re.finditer(p, s):
print('Index:', m.start(), '-', m.end())
上面这个程序将打印出所有的world
出现的位置:
Index: 6 - 11
Index: 13 - 18
这里使用了re.finditer()
函数,它是findall()
函数的迭代版本。re.finditer()
返回一个迭代器,其中每个元素都是一个MatchObject
实例,其中包含每个匹配的信息。
MatchObject
实例包含一些重要的属性和方法:
group()
:返回匹配到的字符串start()
:返回匹配到的字符串开始的下标end()
:返回匹配到的字符串结束的下标我们可以使用这些属性和方法来操作每个匹配到的字符串及其位置。
如果需要将所有的位置存储在一个列表中,可以使用列表推导式:
indices = [m.start() for m in re.finditer(p, s)]
这个代码片段将返回一个列表,其中包含所有world
出现的位置:
[6, 13]
最后要注意的是,re.finditer()
函数需要使用一个正则表达式作为第一个参数来进行匹配。因此,如果需要查找的字符串中包含有正则表达式中的特殊字符,那么需要先进行转义,例如:
p = 'world[.,!?]'
p = re.escape(p) # 对p进行转义,变成'world\\[\\.\\,\\!\\?\\]'
这里使用了re.escape()
函数来对字符串中的特殊字符进行转义,这个函数会将字符串中的所有特殊字符转义,从而使它们不再具有特殊含义。