使用像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个字符,则选择整个字符串,而不在末尾附加三个点。 谢谢 问题答案: 要有条件地检查字符串的长度,请使