获取与正则表达式模式匹配的完整子字符串

时间:2015-10-07 11:59:51

标签: python regex

我不熟悉正则表达式,并且正在查看一些在线资源以了解我想要做什么。基本上,我在Python中有一个正则表达式如下:

import re
pattern = re.compile(r'(?=(ATG(?:...)*?)(?=TAG|TGA|TAA))')

这应该找到所有以ATG开头并以TAG或TGA或TAA结尾的子字符串。我用它作为:

str = "ATGCCCTAG"
print pattern.findall(str)

但是,这会返回ATGCCC并删除尾随TAG,我希望它保留尾随TAG。如何更改它以给我完整的子字符串?

3 个答案:

答案 0 :(得分:3)

  

查找所有以ATG开头并以TAG或TGA或TAA结尾的子字符串

你需要一个

ATG(?:...)*?(?:TAG|TGA|TAA)

此正则表达式还确保在ATG和最后TAGTGATAA之间有0个或更多3个符号(不包括换行符)序列

请参阅regex demo

Python demo

import re
p = re.compile(r'ATG(?:...)*?(?:TAG|TGA|TAA)')
test_str = "FFG FFG ATGCCCTAG"
print (p.findall(test_str))

如果您需要找到非重叠的子字符串,这将有效。为了找到重叠的,技术是将其封装到一个捕获组中并置于一个非锚定的正向预测中:

r'(?=(ATG(?:...)*?(?:TAG|TGA|TAA)))'
  |  |                           ||
  |  | --- Capture group ------- ||   
  | -- Positive look-ahead ------ |

请参阅regex demo

答案 1 :(得分:2)

你似乎不太了解前瞻是什么。前瞻是一个零宽度断言,意味着"字符串中的当前位置后跟" ,换句话说,它匹配任何内容,因为它& #39;只是一个测试。结果,在第二个前瞻中测试的内容,即使你把它放在里面也不会成为捕获组1的一部分。请注意,re.findall仅返回非空结果,因为它返回捕获组内容。

如果要将其包含在捕获组1中,请删除第二个预测并将结束放在捕获组中:

(?=(ATG(?:...)*?(?:TAG|TGA|TAA)))

将整个模式放在前瞻和捕获组中的兴趣是获得重叠结果。例如,ATGCCCATGCCCTAG将返回ATGCCCATGCCCTAGATGCCCTAG

如果您将其删除,则只会获得ATGCCCATGCCCTAG

答案 2 :(得分:2)

您可能希望使用更简单的正则表达式,而不是预测,即:

re.compile("ATG(?:...).*?(?:TAG|TGA|TAA)")

<强>样本:

https://regex101.com/r/qI4fV0/3

<强>说明

ATG(?:...).*?(?:TAG|TGA|TAA)

ATG matches the characters ATG literally (case sensitive)
(?:...) Non-capturing group
    . matches any character (except newline)
    . matches any character (except newline)
    . matches any character (except newline)
.*? matches any character (except newline)
    Quantifier: *? Between zero and unlimited times, as few times as possible, expanding as needed [lazy]
(?:TAG|TGA|TAA) Non-capturing group
    1st Alternative: TAG
        TAG matches the characters TAG literally (case sensitive)
    2nd Alternative: TGA
        TGA matches the characters TGA literally (case sensitive)
    3rd Alternative: TAA
        TAA matches the characters TAA literally (case sensitive)