所以我有字符串
sequence = 'MYNSIYGSPFPKINPKVRYKTALERAGFDTKPRNPFSSQRNASTGSLQASVKSPPITRQRNVSAAPSVPVTMKSAYTASSKSAYSSVKGESDIYPPPVLENSERRSVTPPKNSNFTSSRPSDISRSISRPSERASQEDPFRFERDLDRQAEQYAASRHTCKSPANKEFQAADNFPFNFEQEDAGNTEREQDLSPIERSFMMLTQNDTASVVNSMNQTDNRGVLDQKLGKEQQKEESSIEYESEGQQEDENDIESLNFEPDPKLQMNLENEPLQDDFPEAKQEEKNTEPKIPEINVTRESNTPSLTMNALDSKIYPDDNFSGLESSKEQKSPGVSSSSTKVEDLSLDGLNEKRLSITSSENVETPYTATNLQVEQLIAQLDDVSLSRNAKLDMNGNCLNAVDRKASRFKKSSAYLSGYPSMDIPVTQQTSIVQNSNTNLSRQTILVDKGDVDEDAPSESTTNGGTPIFYKFKQSNVEYSNNEGMGSQETFRTKLPTIEALQLQHKRNITDLREEIDNSKSNDSHVLPNGGTTRYSSDADYKETEPIEFKYPPGEGPCRACGLEVTGKRMFSKKENELSGQWHRECFKCIECGIKFNKHVPCYILGDEPYCQKHYHEENHSICKVCSNFIEGECLENDKVERFHVDCLNCFLCKTAITNDYYIFNGEIPLCGNHDMEALLKEGIDNATSSNDKNNTLSKRRTRLINFN'
我想在每个'K'
和'R'
之后分割此字符串,除非两个字母后面都带有'P'
。最简单的方法是什么?
要重申:在'K'
和'R'
而不是{{11},'KP'
处分割字符串。
答案 0 :(得分:4)
尝试使用负前瞻进行拆分:
re.split(r'[KR](?!P)', sequence)
如果要拆分并在此过程中消耗/删除K
或R
字母,这将是正确的答案。如果您想在保留所有字符的同时先于KR
进行拆分(并且P
不进行 进行),那么我们就不能只做一个简单的re.split
,因为它不支持向后看。
一种解决方法可能是先全部替换,然后在应该进行拆分的每个位置插入标记符号,例如$
,它不会出现在当前输入的任何位置。然后,我们可以对该标记字符进行简单的拆分,以获得所需的结果。
sequence = 'MYNSIYGSPFPK...'
seq_new = re.sub("([KR])([^P])", r'\1$\2', sequence) # insert '$' markers
result = re.split(r'\$', seq_new) # split at '$' and consume the '$'
print result
['MYNSIYGSPFPK', 'INPK', 'VR', 'YK', 'TALER', 'AGFDTKPR', 'NPFSSQR', ...