在Python中匹配字符串?

时间:2013-08-13 12:22:44

标签: python string matching string-matching

使用Python,我如何检查字符串(A)中的3个连续字符是否也包含在另一个字符串(B)中? Python中是否有内置函数?

示例:

A = FatRadio
B = fradio

假设我已经定义了一个阈值3,那么python脚本应该返回true,因为B中有三个连续的字符也包含在A中(注意这也是4和5个连续字符的情况)。

3 个答案:

答案 0 :(得分:2)

这个怎么样?

char_count = 3 # Or whatever you want
if len(A) >= char_count and len(B) >= char_count :
    for i in range(0, len(A) - char_count + 1):
        some_chars = A[i:i+char_count]
        if some_chars in B:
            # Huray!

答案 1 :(得分:2)

您可以使用difflib模块:

import difflib

def have_common_triplet(a, b):
    matcher = difflib.SequenceMatcher(None, a, b)
    return max(size for _,_,size in matcher.get_matching_blocks()) >= 3

结果:

>>> have_common_triplet("FatRadio", "fradio")
True

但请注意,SequenceMatcher除了找到第一个常见的三联体之外还有很多其他功能,因此它可能比天真的方法花费更多的时间。一个更简单的解决方案可能是:

def have_common_group(a, b, size=3):
     first_indeces = range(len(a) - len(a) % size)
     second_indeces = range(len(b) - len(b) % size)
     seqs = {b[i:i+size] for i in second_indeces}
     return any(a[i:i+size] in seqs for i in first_indeces)

哪个应该表现得更好,特别是当匹配位于字符串的开头时。

答案 2 :(得分:1)

我不知道任何内置函数,所以我想最简单的实现将是这样的:

a = 'abcdefgh'
b = 'foofoofooabcfoo'

for i in range(0,len(a)-3):
  if a[i:i+3] in b:
    print 'then true!'

可以缩短为:

search_results = [i for in range(0,len(a)-3) if a[i:i+3] in b]