正则表达式匹配一个混合大写字母和\ n的字符串

时间:2016-12-24 23:35:08

标签: python regex

我想编写一个正则表达式,只有当字符串以\ 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')

有人知道出了什么问题吗?

谢谢!

1 个答案:

答案 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'