Python 在与不同字符串列表匹配的位置拆分字符串列表
我写了一个小程序来做下面的事情。我想知道是否有一个更明显的最佳解决方案: 1) 取两个字符串列表。通常,第二个列表中的字符串将比第一个列表中的字符串长,但这不能保证Python 在与不同字符串列表匹配的位置拆分字符串列表,python,string,split,Python,String,Split,我写了一个小程序来做下面的事情。我想知道是否有一个更明显的最佳解决方案: 1) 取两个字符串列表。通常,第二个列表中的字符串将比第一个列表中的字符串长,但这不能保证 2) 返回从已从第一个列表中删除任何匹配字符串的第二个列表派生的字符串列表。因此,该列表将包含以下字符串:让我们定义该字符串,s,以及要删除的字符串列表:list1: >>> s = 'NowIsTheTimeForAllGoodMenToComeToTheAidOfTheParty' >>> l
2) 返回从已从第一个列表中删除任何匹配字符串的第二个列表派生的字符串列表。因此,该列表将包含以下字符串:让我们定义该字符串,
s
,以及要删除的字符串列表:list1
:
>>> s = 'NowIsTheTimeForAllGoodMenToComeToTheAidOfTheParty'
>>> list1 = 'The', 'Good'
现在,让我们删除这些字符串:
>>> import re
>>> re.split('|'.join(list1), s)
['NowIs', 'TimeForAll', 'MenToComeTo', 'AidOf', 'Party']
上面的强大功能之一是list1
中的字符串可以包含regex活动字符。这也可能是不可取的。正如John La Rooy在评论中指出的那样,list1
中的字符串可以通过以下方式处于非活动状态:
>>> re.split('|'.join(re.escape(x) for x in list1), s)
['NowIs', 'TimeForAll', 'MenToComeTo', 'AidOf', 'Party']
使用正则表达式可以简化代码,但它可能更高效,也可能不会更高效
>>> import re
>>> sequence_list = ['MPHSSLHPSIPCPRGHGAQKA', 'AEELRHIHSRYRGSYWRTVRA', 'KGLAPAEISAVCEKGNFNVA'],positions_list=[(0, 20), (66, 86), (136, 155)]
>>> avoid = ['SRYRGSYW']
>>> rex = re.compile("|".join(map(re.escape, avoid)))
获得这样的位置(需要将偏移添加到这些位置)
得到像这样的新字符串
>>> [rex.split(i) for i in sequence_list]
[['MPHSSLHPSIPCPRGHGAQKA'], ['AEELRHIH', 'RTVRA'], ['KGLAPAEISAVCEKGNFNVA']]
还是被压扁的名单
>>> [j for i in sequence_list for j in rex.split(i)]
['MPHSSLHPSIPCPRGHGAQKA', 'AEELRHIH', 'RTVRA', 'KGLAPAEISAVCEKGNFNVA']
string.split()
接受子字符串分隔符。您的算法看起来可以在分隔符字符串上进行迭代。您应该始终re.escape()that@JohnLaRooy说得好。我喜欢正则表达式中的活跃角色,但你绝对是对的,不是每个人都会喜欢。答案更新为re.escape
解决方案。
>>> [[j.span() for j in rex.finditer(i)] for i in sequence_list]
[[], [(8, 16)], []]
>>> [rex.split(i) for i in sequence_list]
[['MPHSSLHPSIPCPRGHGAQKA'], ['AEELRHIH', 'RTVRA'], ['KGLAPAEISAVCEKGNFNVA']]
>>> [j for i in sequence_list for j in rex.split(i)]
['MPHSSLHPSIPCPRGHGAQKA', 'AEELRHIH', 'RTVRA', 'KGLAPAEISAVCEKGNFNVA']