python - 在 Python 中查找与正则表达式匹配的所有(包括重叠的)子字符串
问题描述
我需要在字符串中找到与正则表达式匹配的所有子字符串的位置。例如,如果字符串是abbba
并且正则表达式是(b|bb)(?=a)
,则结果应该是[(2, 4), (3, 4)]
。
我想出的是
def get_ranges(pattern: str, string: str) -> list[tuple[int, int]]:
n = len(string)
return [(start, end) for start in range(n + 1) for end in range(start, n + 1)
if re.fullmatch(f'.{{{start}}}({pattern}).{{{n - end}}}', string)]
但这往往执行得非常缓慢,特别是考虑到它不允许使用预编译的正则表达式。有没有更有效的方法来解决问题?
解决方案
首先我认为你应该使用for end in range(start, n + 1)
. 对于end
变量,我看不出有任何理由每次迭代都从 0 开始。只需进行此编辑,执行此代码
for i in range(300000):
get_ranges(r"(b|bb)(?=a)", "abbba")
我从 9.67 秒到 6.01 秒。
推荐阅读
- android - recyclerview 仅在第二次单击 kotlin 中的另一个按钮时显示
- laravel - Laravel - 以删除模式形式提交按钮没有响应
- java - 简单的循环列表
- nginx - 在 nginx 中,如何允许任何字符串作为 http 方法?
- tfs - 我们如何修复 Azure DevOps SonarQube 错误:类路径包含多个 SLF4J 绑定
- javascript - 如何从多个对象中找到一个字符串?
- tensorflow - 有没有办法在服务器中只加载一次 tensorflow 模型,而不是每次都使用新的传入请求加载模型?
- java - 如何将小数组复制到更大的数组?
- react-table - 列显示属性是否在最新的 react-table v7 中停止工作?
- arrays - Laravel foreach 数组在视图中