我的Python笔记·正则表达式
Posted 生信菜鸟团
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的Python笔记·正则表达式相关的知识,希望对你有一定的参考价值。
本文内容
使用正则表达式来表达共有序列
使用正则表达式在字符串中搜索子字符串
问题
在蛋白质序列中搜索磷酸化motif,并返回第一个出现的motif
import re
seq = "VSVLTMFRYAGWLDRLYMLVGTQLAAIIHGVALPLMMLI"
pattern = re.compile('[ST]Q')
match = pattern.search(seq)
if match:
print (match.start(),match.end())
print (match.group())
else:
print ("no match")
21 23
TQ
程序是如何工作的
程序第一行导入了模块
re
;pattern = re.compile('[ST]Q')
设定一个正则表达对象来匹配SQ
或TQ
;若序列中包含pattern子串,则返回Match对象,否则返回None。
编译正则表达式
在Python中使用正则表达式需要使用模块
re
;compile()
编译字符串并且转换成正则表达对象。当然,也可以传递参数到compile()
中。
模式匹配
search()
函数扫描字符串并寻找正则表达式第一次匹配的位置,需要注意的是search()
方法返回的是Match object
而不是直接返回字符串
import re
seq = "ATAGAGAGGTAGAGTAAG"
pattern = re.compile('TA[AG]')
match = pattern.search(seq)
match
<_sre.SRE_Match object; span=(1, 4), match='TAG'>
match.group()
返回第一个匹配的字符串;match.span()
返回第一个匹配结果的起点和终点;match.start()
返回第一个匹配结果的起始位置;match.end()
返回匹配结果的结束位置。
import re
seq = "ATAGAGAGGTAGAGTAAG"
pattern = re.compile('TA[AG]')
match = pattern.search(seq)
print(match.group(),match.span(),match.start(),match.end())
TAG (1, 4) 1 4
如果我想要找所有的匹配结果呢?
findall()
可返回包含所有匹配的一个字符串列表;finditer()
也可以返回所有匹配对象并且返回迭代器形式,即可以用for
循环进行遍历。
all = pattern.findall(seq)
all
['TAG', 'TAG', 'TAA']
iter = pattern.finditer(seq)
iter
<callable_iterator at 0x234fecd0780>
for i in iter:
print(i.group())
print(i.span())
print(i.start())
print(i.end())
TAG
(1, 4)
1
4
TAG
(9, 12)
9
12
TAA
(14, 17)
14
17
分组
有时候会将一个正则表达式分为若干个子组,来匹配不同的部分,比如想要知道.
匹配了什么氨基酸,可以将她用圆括号括起来以创建一个组,然后使用group()
方法得到相匹配的氨基酸类型。
group()
方法不填写参数或参数为0,则返回完全匹配的字符串;子组从1开始自左向右编号。
import re
seq = "VSVLTMFRYSTALDRLYMLVGTQLAAIIHGVALPLMMLI"
pattern = re.compile('R(.)([ST])([^p])')
match = pattern.search(seq)
print(match.group())
print(match.group(1))
print(match.group(2))
print(match.group(3))
RYST
Y
S
T
也可以向
group()
方法中传递多个参数,得到各个子组的元组。
print(match.group(3,2,1))
('T', 'S', 'Y')
groups()
方法返回一个包含所有与子组相关的元组。
print(match.groups())
('Y', 'S', 'T')
修改字符串
re模块提供了三种修改字符串的方法:
split(s)
sub(pattern, repl, string, count=0, flags=0)
subn(r,s,[c])
split(s)
方法将分割符合正则表达式的字符串,产生一个列表。在下面的例子中,实现了一个字符串在|
处分割,又因为|
是元字符所以需要加反斜杠转义。
import re
separator = re.compile('\|')
annotation = 'ATOM:CA|RES:ALA|CHAIN:B|NUMRES:166'
columes = separator.split(annotation)
print(columes)
['ATOM:CA', 'RES:ALA', 'CHAIN:B', 'NUMRES:166']
sub(pattern, repl, string, count=0, flags=0)
方法:
pattern : 正则中的模式字符串;
repl : 替换的字符串,也可为一个函数;
string : 要被查找替换的原始字符串;
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
猜你喜欢
▼ 如果你生信基本技能已经入门,需要提高自己,请关注下面的生信技能树,看我们是如何完善生信技能,成为一个生信全栈工程师。
▼ 如果你是初学者,请关注下面的生信菜鸟团,了解生信基础名词,概念,扎实的打好基础,争取早日入门。
以上是关于我的Python笔记·正则表达式的主要内容,如果未能解决你的问题,请参考以下文章