【发布时间】:2021-08-12 09:58:13
【问题描述】:
问题
我有一个长文本和许多句子。 我想找到句子在文本中的位置。 如果在文本中多次找到它,我想知道所有的位置。 即使每个单词之间有很多空格,我也想匹配句子。
举例
text = "这是一个示例文本,这是我的查询" query = ["这是我的查询", "这是另一个查询"]
答案:[(query_0_positions), (no_positions_for_query_1)]
我目前的解决方案
我使用pythonre模块的方式如下:
- 我在单词之间使用 \s* 来编译查询模式 - 例如:this\sis\smy\s*query
- 对文本使用 finditer 并迭代匹配项
Python 代码示例
import re
text = 'This is a sample text, this is my query'
queries = ['this is my query', 'this is a another query']
for query in queries:
query = re.sub(r'\\ ', "\s*", re.escape(query))
pattern = re.compile(query, flags=re.IGNORECASE | re.MULTILINE)
matches = pattern.finditer(text)
# Do somthing with the matches
问题
当查询很多且文本很长时,这可能会非常慢。
是否有任何算法思想或实现可以帮助我实现同样的功能,同时提高效率?
【问题讨论】:
-
为什么不在
for-loop之前编译正则表达式? -
因为每个查询的模式都不同
-
只是在这里大声思考...(a)如果空格无关紧要,您基本上是在寻找单词列表中的子序列,并且(b)也许您可以找到该列表中的位置/索引每个单词出现的位置,然后检查查询中的单词出现在连续索引的位置。