Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到不完美的子字符串?_Python_Regex_Python 2.7 - Fatal编程技术网

Python 如何找到不完美的子字符串?

Python 如何找到不完美的子字符串?,python,regex,python-2.7,Python,Regex,Python 2.7,我有一个等长的子字符串列表,对于所有这些子字符串,我想在一个大字符串中找到一个位置。然而,棘手的是,我还应该找到不匹配数量有限的子字符串(也给出了不匹配的数量)。我想我可以用正则表达式来实现这一点,但我找不到方法。UPD:我正在使用Python 2.7 例如: 输入字符串:s='atgtcgatcgatgctagctataaaa',输入子字符串为s0='ATG',允许的不匹配数为n=1。我想要的是返回一个iterable,比如一个位置列表:[0,7,19,23,6],它对应于“ATG”(两次)、

我有一个等长的子字符串列表,对于所有这些子字符串,我想在一个大字符串中找到一个位置。然而,棘手的是,我还应该找到不匹配数量有限的子字符串(也给出了不匹配的数量)。我想我可以用正则表达式来实现这一点,但我找不到方法。UPD:我正在使用Python 2.7

例如:
输入字符串:
s='atgtcgatcgatgctagctataaaa'
,输入子字符串为
s0='ATG'
,允许的不匹配数为n=1。我想要的是返回一个iterable,比如一个位置列表:
[0,7,19,23,6]
,它对应于“ATG”(两次)、“ATA”(两次)、“ATC”对应的位置,因为字符串中没有出现其他不匹配的3-mer。

您考虑过使用Levenshtein距离算法寻求帮助吗?它用于确定两个字符串之间的相似程度

下面是一个简单的实现:

  • 对于i=0至len(干草堆)-len(针头)
  • 让势匹配=干草堆[i,i+len]
  • 查看潜在匹配和针头之间的Levenshtein距离
  • 如果距离为0,则为完美匹配
  • 如果距离小于阈值,则存在不完美但足够接近的匹配
  • 否则,继续下一步

  • 您是否考虑过使用Levenshtein距离算法寻求帮助?它用于确定两个字符串之间的相似程度

    下面是一个简单的实现:

  • 对于i=0至len(干草堆)-len(针头)
  • 让势匹配=干草堆[i,i+len]
  • 查看潜在匹配和针头之间的Levenshtein距离
  • 如果距离为0,则为完美匹配
  • 如果距离小于阈值,则存在不完美但足够接近的匹配
  • 否则,继续下一步

  • 鉴于我对你的问题的理解:

    类型1

    def diff_count(s1, s2):
        count = 0
        for i in range(len(s1)):
            if s1[i] != s2[i]:
                count += 1
        return count
    
    def diff_filter1(s1, s2, max_count):
        return diff_count(s1, s2) < max_count
    

    鉴于我对你的问题的理解:

    类型1

    def diff_count(s1, s2):
        count = 0
        for i in range(len(s1)):
            if s1[i] != s2[i]:
                count += 1
        return count
    
    def diff_filter1(s1, s2, max_count):
        return diff_count(s1, s2) < max_count
    
    新模块支持模糊匹配。比如说

    (?:foo){s<=2} 
    
    (?:foo){s>>regex.findall(r'(?:foo){s新模块支持模糊匹配

    (?:foo){s<=2} 
    

    (?:foo){s>>regex.findall(r'(?:foo){s很高兴地展示了一些预期输出的示例,正则表达式不可能做到这一点。我遇到的所有语言中的正则表达式的默认实现都不支持这一点。到目前为止,我所知道的唯一进行模糊匹配的库是正则表达式包。输入字符串:
    s='atgtcgatgctagataaaa'
    ,Input substring是
    s0='ATG'
    ,允许的不匹配数是
    n=1
    。我想要的是返回一个iterable,比如一个位置列表:
    [0,7,19,23,6]
    ,对应于
    'ATG'(2),'ATA'(2)的位置,'ATC'
    相应地,因为字符串中没有其他不匹配的3-mer。请给出一些预期输出的示例,这在正则表达式中是不可能的。我遇到的所有语言中的正则表达式的默认实现都不支持这一点。到目前为止,我知道的唯一一个实现模糊匹配的库ng是正则表达式包。输入字符串:
    s='atgtcgatcgatagtagataaaa'
    ,输入子字符串是
    s0='ATG'
    ,允许的不匹配数是
    n=1
    。我想要的是返回一个位置的可数,比如说一个列表:
    [0,7,19,23,6]
    ,它们对应于
    'ATG'(2),'ATA'(2)的位置,“ATC”
    相应,因为字符串中没有出现任何其他不匹配的3-mer。非常感谢!这是我一直在寻找的!非常感谢!这是我一直在寻找的!
    >>> regex.findall(r'(?:foo){s<=2}', 'xxfoo')
    ['xfo']
    >>> regex.findall(r'(?:foo){s<=2}', 'xxfoo', regex.BESTMATCH)
    ['foo']