【问题标题】:String compare in pythonpython中的字符串比较
【发布时间】:2017-10-06 19:35:57
【问题描述】:

我正在通过比较文件名来查找重复文件。

但是,我发现os.walk 返回的一些路径包含转义字符。例如,我可能会为一个文件获得structure in the Earth\'s core.pdf,而为另一个文件获得structure in the Earth\xe2\x80\x99s core.pdf

In [1]: print 'structure in the Earth\'s core.pdf\nstructure in the Earth\xe2\x80\x99s core.pdf'
structure in the Earth's core.pdf
structure in the Earth’s core.pdf

In [2]: 'structure in the Earth\'s core.pdf' == 'structure in the Earth\xe2\x80\x99s core.pdf'
Out[2]: False

我该如何处理这些情况?

==== 只是为了澄清针对cmets的Q,重复文件还有其他情况,例如

  • 一个文件名包含的空格比另一个文件名多
  • 一个文件名由-分隔,另一个由:分隔
  • 一个文件名包含日文/中文单词,另一个由数字和日文/中文单词组成...

【问题讨论】:

  • 它们是两个不同的字符...' 不等于。您可以将一个替换为另一个,或者只比较给定句子的字母数字。
  • 它们不是相同的,因为它们使用不同的编码来创建相同的一般视觉外观。参考文献this 类似讨论的链接。正如@bulbus 所说,它们是不同的角色。解决这个问题很复杂,因为它打开了一罐关于有多少种可能的方式可以说出一些在智力上相似但实际上并不相同的东西。
  • 您可以尝试将它们归结为“字典”表示,在比较之前去掉所有非字母数字,然后编写报告。
  • 我知道' 不是。但是这两个文件是一样的。由于某些原因,它们的名称并不完全相同。还有其他情况,例如一个文件名包含比另一个更多的空格一个文件名由-分隔,而另一个由:分隔一些文件名包含非-letter chars as Japanese/Chinese words...这些是我现在的困难。
  • @bulbus 我没有这样的集合,包括所有可能的字符对。仅比较字母和数字可能是一种解决方法。

标签: python string character-encoding char


【解决方案1】:

也许您可以获得字符串的相似性而不是完全匹配。由于大写等简单的事情,获得​​完全匹配可能会出现问题。

我建议如下:

from difflib import SequenceMatcher

s1 = "structure in the Earth\'s core.pdf"
s2 = "structure in the Earth\xe2\x80\x99s core.pdf"

matcher = SequenceMatcher()
matcher.set_seqs(s1, s2)
print(matcher.ratio())
# 0.9411764705882353

这个结果表明两个字符串之间的相似度都在 94% 以上。您可以定义一个阈值来删除或在删除之前查看项目。

【讨论】:

    猜你喜欢
    • 2019-01-17
    • 2016-08-19
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2012-06-14
    • 2015-09-29
    相关资源
    最近更新 更多