我想编写一个正则表达式,只有当字符串以\ n开头时才会匹配字符串,并且至少有一个大写字母并以\ n结束。该字符串可能包含此模式的重复,例如:
\ n [A-Z] \ n上[A-Z] \ n上。
我试过这个正则表达式:\ n(([A-Z] + \ n)+),在这个输入上:
200LA 012F5421F2E8A172 164 XRAY 1.950 0.176 NA无细胞内溶素[肠杆菌噬菌体T4] || 1C63A 1C64A 1C65A MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILR NAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMAQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDA YKNL
我希望得到这个结果: ( 'MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMAQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL')
但相反,我得到了这个: ('MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILR \ nNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSRRQQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDA \ nYKNL \ n','YKNL \ n')
有人知道出了什么问题吗?
谢谢!
答案 0 :(得分:0)
您的正则表达式匹配符合您条件的第一部分(可能的最长版本)。
文字中的第一行不以\n
开头,因此它会移动到第一个\n
后面的行,因为它符合条件,您指定的组结果接受正则表达式。
对于你的结果,我建议与\n(?:[A-Z]+\n)+
匹配(?:
代表非捕获组,以防止捕获除最后一组之外的任何一个),然后用空字符串替换换行:
>>> a = """>200LA 012F5421F2E8A172 164 XRAY 1.950 0.176 NA no Endolysin <ENLYS_BPT4(1-164)> [Enterobacteria phage T4] ||1C63A 1C64A 1C65A
... MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILR
... NAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMAQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDA
... YKNL
... """
>>> m = re.findall('\n(?:[A-Z]+\n)+', a)
>>> m[0].replace('\n', '')
'MNIFEMLRIDEGLRLKIYKDTEGYYTIGIGHLLTKSPSLNAAKSELDKAIGRNTNGVITKDEAEKLFNQDVDAAVRGILRNAKLKPVYDSLDAVRRAALINMVFQMGETGVAGFTNSLRMAQQKRWDEAAVNLAKSRWYNQTPNRAKRVITTFRTGTWDAYKNL'