【问题标题】:Find common fragments in multiple strings using SequenceMatcher [duplicate]使用 SequenceMatcher 在多个字符串中查找常见片段 [重复]
【发布时间】:2020-10-29 16:28:05
【问题描述】:

我想在以下之间找到共同的字符串: strings_list = ['PS1 123456 测试', 'PS1 758922 测试', 'PS1 978242 测试']

下面的代码只返回第一部分“PS1 1”,我想结果是“PS1 Test”。你能帮我吗,是否可以使用 SequenceMatcher 获得?提前谢谢!

def findCommonStr(strings_list: list) -> str:

        common_str = strings_list[0]

        for i in range(1, n):
            match = SequenceMatcher(None, common_str, strings_list[i]).get_matching_blocks()[0]      
            common_str = common_str[match.b: match.b + match.size]

        common_str = common_str.strip()

        return common_str

【问题讨论】:

  • 对于['PS1 123456 Test', 'PS1 Test 454'],答案仍然是PS1 Test,对吗?
  • common = set.intersection(*map(set, map(str.split, strings_list))).
  • (ping) 您能否通过接受您最喜欢的答案(如果确实有)来帮助 stackoverflow 机制,以便答案的作者不会在他们的活动列表中看到这个问题;)谢谢你的参与。如果没有一个答案是相关的,请忽略这个 ping。

标签: python python-3.x string sequencematcher


【解决方案1】:

这是没有 SequenceMatcher 的方法。如果所有字符串都遵循相同的模式,您可以将它们拆分为空格上的单词。

strings_list = ['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']

test = []
for string in strings_list:
  print(string.split())
  test.append(string.split())

>>> ['PS1', '123456', 'Test']
['PS1', '758922', 'Test']
['PS1', '978242', 'Test']

现在你可以简单地做一个集合交集来找到共同的元素。参考:Python -Intersection of multiple lists?

set(test[0]).intersection(*test[1:])

>>> {'PS1', 'Test'}

# join them to get string
' '.join(set(test[0]).intersection(*test[1:]))

>>> PS1 Test

这只有在它们遵循这种由空格分隔的模式时才有效。

功能:

def findCommonStr(strings_list: list) -> str:

  all_str = []
  for string in strings_list:
    
    all_str.append(string.split())

  return ' '.join(set(all_str[0]).intersection(*all_str[1:]))

【讨论】:

    【解决方案2】:

    您需要保留所有片段,而不仅仅是第一个:

    def get_common_str(strs: List[str]) -> str:
        common_str = strs[0] if strs else ''
    
        for str_ in strs[1:]:
            common_str = ''.join(
                common_str[m.a:m.a + m.size]
                for m in SequenceMatcher(None, common_str, str_).get_matching_blocks()
            )
    
        return common_str
    
    
    print(get_common_str(['PS1 123456 Test', 'PS1 758922 Test', 'PS1 978242 Test']))
    

    给了

    PS1 2 Test
    

    这个问题很棘手,所以这个启发式方法可能并不总是有效,请随意提出另一个问题!不过,看起来 SequenceMatcher 在您的情况下做得很好。我们不仅得到了常用词,还得到了词片段,非常令人印象深刻。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2020-05-12
      相关资源
      最近更新 更多