【问题标题】:How to distinguish between a sub-string and exact word?如何区分子字符串和确切的单词?
【发布时间】:2015-04-21 02:05:03
【问题描述】:

我正在尝试解决文本匹配问题,在该问题中我试图找到与没有不正确匹配的产品列表之间的匹配。行进是通过文本相似性完成的。问题是假设我在一个列表中有"product G1234",在另一个列表中有"product G1",这两个元素的所有其他功能都是相同的。 python中的string operatorin在这里不是一个好选择,因为它匹配这两个产品(它不应该),有人有什么建议吗?

【问题讨论】:

  • 检查 EOL 和空格?
  • in 不是字符串函数,而是运算符。
  • 很难理解你到底需要什么。但也许你读过 Levenshtein 距离算法?

标签: python string string-matching


【解决方案1】:

使用使用单词边界\b 的正则表达式来进行精确的单词匹配。 \b 匹配单词字符和非单词字符(反之亦然)。此处不能使用 split,因为要检查的子字符串中间包含空格。

\bsub_string\b

示例:

>>> re.search(r'\bproduct G1\b', "product G1234")
>>> re.search(r'\bproduct G1\b', "product G1")
<_sre.SRE_Match object; span=(0, 10), match='product G1'>
>>> 

>>> re.search(r'(?<!\S)product G1(?!\S)', "product G1")
<_sre.SRE_Match object; span=(0, 10), match='product G1'>
>>> re.search(r'(?<!\S)product G1(?!\S)', "product G1234")
>>> 

【讨论】:

  • 感谢您的回答,这行得通。但是你知道re.search算法的效率吗?似乎需要一些时间,因为我正在处理兆字节的文本文件,所以我没有选择使用耗时的算法
  • 只需遍历每一行,然后在每一行上应用上面的正则表达式。我建议你使用re.search,因为re.match会从一开始就尝试匹配输入行。
  • 如果搜索词是 for i in Dictionary: if re.search('\\b'+i+'\\b',line): print(i,'\t',line) 之类的迭代器怎么办 对吗?似乎对我有用,只是想知道是否有更好的方法。
猜你喜欢
  • 2016-11-16
  • 2018-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
相关资源
最近更新 更多