我想找到所有出现的子字符串,同时忽略某些字符。我怎样才能在Python中做到这一点?
示例:
long_string = 'this is a t`es"t. Does the test work?'
small_string = "test"
chars_to_ignore = ['"', '`']
print(find_occurrences(long_string, small_string))
应该返回 [(10, 16), (27, 31)] 因为我们想忽略字符 ` 的存在,并且 ".
-
(10, 16)
是开始t`es"t inlong_string
的结束索引, -
(27, 31)
是test
inlong_string
的开始和结束索引。
import re
def find_occurrences(long_string, small_string, chars_to_ignore):
"""查找字符串中所有出现的子字符串,同时忽略某些字符。
Args:
long_string: 要搜索的字符串。
small_string: 要查找的子字符串。
chars_to_ignore: 要忽略的字符列表。
Returns:
字符串中所有出现的子字符串的开始和结束索引列表,忽略指定的字符。
"""
# 创建一个正则表达式模式,匹配 small_string,忽略 chars_to_ignore 中的字符
pattern = f"[{''.join(chars_to_ignore)}]*".join(re.escape(char) for char in small_string)
occurrences = []
for match in re.finditer(pattern, long_string):
occurrences.append((match.start(), match.end()))
return occurrences
long_string = 'this is a t`es"t. Does the test work?'
small_string = "test"
chars_to_ignore = ['"', '`']
print(find_occurrences(long_string, small_string, chars_to_ignore))
本代码的功能如下:
-
使用正则表达式:
它使用
re
模块来处理正则表达式,从而实现灵活的模式匹配。 - 动态生成模式: 代码根据要忽略的字符和目标子字符串动态生成正则表达式模式。
-
查找所有匹配项:
re.finditer
函数用于查找所有匹配的子字符串,并返回它们的开始和结束索引。 - 返回索引列表: 代码将所有匹配的子字符串的索引存储在一个列表中,并返回该列表。
此代码将打印以下内容:
[(10, 16), (27, 31)]
这正是想要的结果。此代码首先创建一个正则表达式模式,该模式匹配
small_string
中的所有字符,同时忽略
chars_to_ignore
中的任何字符。然后,它使用此模式在
long_string
中查找所有匹配项,并返回它们的索引。