我不熟悉正则表达式,并且正在查看一些在线资源以了解我想要做什么。基本上,我在Python中有一个正则表达式如下:
import re
pattern = re.compile(r'(?=(ATG(?:...)*?)(?=TAG|TGA|TAA))')
这应该找到所有以ATG开头并以TAG或TGA或TAA结尾的子字符串。我用它作为:
str = "ATGCCCTAG"
print pattern.findall(str)
但是,这会返回ATGCCC
并删除尾随TAG
,我希望它保留尾随TAG
。如何更改它以给我完整的子字符串?
答案 0 :(得分:3)
查找所有以ATG开头并以TAG或TGA或TAA结尾的子字符串
你需要一个
ATG(?:...)*?(?:TAG|TGA|TAA)
此正则表达式还确保在ATG
和最后TAG
,TGA
或TAA
之间有0个或更多3个符号(不包括换行符)序列
请参阅regex 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
将返回ATGCCCATGCCCTAG
和ATGCCCTAG
。
如果您将其删除,则只会获得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)