测试目标字符串中键字符串的精确匹配。输出必须是匹配起始点的元组。我的代码有效,但我觉得它可以更整洁。如何在不转换附加列表的情况下返回元组?到处搜索,似乎无法找到答案。谢谢!
from string import *
target1 = 'atgacatgcacaagtatgcat'
target2 = 'atgaatgcatggatgtaaatgcag'
key10 = 'a'
key11 = 'atg'
key12 = 'atgc'
key13 = 'atgca'
def subStringMatchExact(target, key):
match_list = []
location = 0
for i in target:
ans = find(target, key, location)
if ans >= 0:
match_list.append(ans)
location = ans + (len(key))
print tuple(match_list)
subStringMatchExact(target1, key11)
答案 0 :(得分:1)
这是正则表达式的完美工作。
import re
def subStringMatchExact(target, key):
regex = re.compile(re.escape(key))
return tuple(match.start() for match in regex.finditer(target))
请注意,这仅查找非重叠匹配。如果你想找到重叠的匹配项:
def subStringMatchExact(target, key):
regex = re.compile("(?=" + re.escape(key) + ")")
return tuple(match.start() for match in regex.finditer(target))
当然,除非您确实需要将结果作为元组,否则您可以从最后一行中删除tuple
并让函数返回更高效的生成器。
答案 1 :(得分:1)
def subStringMatchExact(target, key):
i = target.find(key)
while i != -1:
yield i
i = target.find(key, i + len(key))
print tuple(subStringMatchExact(target1, key11))
顺便说一句,请勿使用target1
,key11
使用targets
,keys
列表等名称。
答案 2 :(得分:0)
这是另一种方法:
def find_sublist(l, sublist):
for i in xrange(len(l)-len(sublist)+1):
if sublist == l[i:i+len(sublist)]:
yield i
然后你可以做这样的事情来获得你的元组:
tuple(find_sublist(target1, key11))