当前位置: 首页 > 面试题库 >

在Python中检查较长字符串中存在的模糊/近似子字符串?

凌智
2023-03-14
问题内容

使用像leveinstein(leveinstein或difflib)之类的算法,很容易找到近似匹配。

>>> import difflib
>>> difflib.SequenceMatcher(None,"amazing","amaging").ratio()
0.8571428571428571

可以通过根据需要确定阈值来检测模糊匹配。

当前要求:基于较大字符串中的阈值来查找模糊子字符串。

例如。

large_string = "thelargemanhatanproject is a great project in themanhattincity"
query_string = "manhattan"
#result = "manhatan","manhattin" and their indexes in large_string

一种蛮力解决方案是生成长度为N-1到N +
1(或其他匹配长度)的所有子串,其中N是query_string的长度,并在它们上逐个使用levenstein并查看阈值。

在python中是否有更好的解决方案,最好是python 2.7中包含的模块,或外部可用的模块。

---------------------更新和解决方案----------------

Python正则表达式模块工作得很好,尽管re对于模糊子字符串情况,它比内置模块要慢一些,由于额外的操作,这显然是一个结果。期望的输出是好的,并且可以容易地定义对模糊度的控制。

>>> import regex
>>> input = "Monalisa was painted by Leonrdo da Vinchi"
>>> regex.search(r'\b(leonardo){e<3}\s+(da)\s+(vinci){e<2}\b',input,flags=regex.IGNORECASE)
<regex.Match object; span=(23, 41), match=' Leonrdo da Vinchi', fuzzy_counts=(0, 2, 1)>

问题答案:

即将取代re的新正则表达式库包括模糊匹配。

https://pypi.python.org/pypi/regex/

模糊匹配语法看起来很有表现力,但这将使您的匹配项具有一个或更少的插入/添加/删除。

import regex
regex.match('(amazing){e<=1}', 'amaging')


 类似资料:
  • 问题内容: 我之前已经找到了这个问题的一些答案,但是对于当前的Python版本似乎已经过时了(或者至少它们对我不起作用)。 我想检查子字符串是否包含在字符串列表中。我只需要布尔结果。 我找到了这个解决方案: 我希望从这段代码中得到一个价值。如果单词是“ der”,则输出应为。 但是,结果是一个生成器函数,我找不到找到该值的方法。 任何想法? 问题答案: 您可以导入从的情况下,它是由一些其他的替代:

  • 问题内容: 我似乎无法找到的代码等效,像功能,这在任何地方为Python: 基本上,我想检查一个字符串是否包含列表中的子字符串。 问题答案: 试试这个测试: 如果中包含任何子字符串,它将返回。 请注意,链接的问题中有的答案的Python类似物: 在Python 3中,您可以直接使用: 虽然上面使用生成器表达式的版本可能更清楚。

  • 问题内容: 我有: 功能: 和一个字符串:, 我本质上是想输入并返回,但是我却不断地返回。 码: 不知道怎么了! 问题答案: 理想情况下,您会 像痴呆的刺猬说的那样 使用 str.find 或 str.index 。但是你说你不能… 您的问题是您的代码仅搜索搜索字符串的第一个字符(第一个字符在索引2)。 您基本上是说if是in ,递增直到我测试它返回3时,但这仍然是错误的。这是一种方法。 它产生了

  • 问题内容: 如何检查是否是那里的? 我想分配给是否有结果,否则。 我当前的代码是: 问题答案:

  • 问题内容: 如何检查数组中的任何字符串是否在另一个字符串中? 喜欢: 该代码行不通,只是为了展示我想要实现的目标。 问题答案: 你可以使用: 同样,要检查是否找到了列表中的所有字符串,请使用all代替any。

  • 问题内容: 在视图中,我有一个列 注释 ,其中可能包含大字符串。我只想选择前60个字符,并在所选字符串的末尾附加’ … ‘。 为了选择前60个字符,我使用了以下查询: 现在,我希望其处理如下: 检查它是否包含60个以上的字符。 如果包含,则仅选择前6个字符,并在末尾附加三个点。 如果它不包含超过60个字符,则选择整个字符串,而不在末尾附加三个点。 谢谢 问题答案: 要有条件地检查字符串的长度,请使