字符串解析
字符串解析是从一大段信息中,解析出自己需要的内容。比如从下面的字符中解析出序列ID Z78533.1和物种名C.irapeanum
s1 = '>gi|2765656|emb|Z78531.1|CFZ78531 C.fasciculatum 5.8s rRNA gene'
s2 = '>gi|2765658|emb|Z78533.1|CFZ78533 C.irapeanum 5.8s rRNA gene'
s3= '>gi|2765658|emb|Z78533.1|CFZ78533 C.irapeanum 5.8s rRNA gene'
s1
方法一:字符串分割
可以使用字符串分割的方式,而更为强大的工具就是正则表达式
infos = s1.replace('|',' ').split(' ')
seq_id = infos[3]
species = infos[5]
print('seq_id',seq_id)
print('species',species)
方法二:正则表达式
字符 | 含义头 |
---|---|
^ | 匹配字符串的开头 |
. | 匹配任意字符,除了换行符 |
x\ | y |
[xyz] | 'x'或 'y' 或 'z' |
[^xyz] | 除了'x' 或 'y'或'z',以外的字符 |
N* | 匹配 0个或多个'N' |
N+ | 匹配 1个或多个'N' |
N? | 非贪婪方式 |
N{2} | 匹配 2个'N' |
N{2,} | 匹配2个以上 'N' |
N{3,8} | 匹配3到8个 'N' |
\w | 匹配数字字母下划线 |
\W | 匹配非数字字母下划线 |
\s | 匹配任意空白字符,等价于[\t\n\r\f] |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于[0-9] |
\D | 匹配任意非数字 |
\n,\t等 | 匹配一个换行符,匹配一个制表符等 |
应用一:分隔字符串
import re
s1
re.split('\s+|\|',s1)
应用二:替换
phone = '184-3476-4125'
re.sub('\D','',phone)
应用三:校验是否合格
1.网址是否包含www.并且以.com或.cn结尾
m = re.search('w{3}.\w+.(com|cn)$', 'http://www.ecology.cn')
m
以下方法可以提取匹配上的信息
m.start()
m.end
m.span
m.group
2.邮箱是否包含@
n = re.search('\w+@\w+.\w+', '810234309@qq.com')
n
3.电话号码是否为11位数字,而且以1开头
v = re.search('^1\d{10}', '18434764125')
v
应用四:捕获
1.捕获ID中的编号和物种名
z = re.search('^>gi\|\d{7}\|emb\|(\S+)\|\S+\s+(\S+)\s',s1)
print("匹配上的内容为:" + z.group())
print("基因的编号为:" + z.group(1))
print("物种名为:" + z.group(2))
应用五:查找
h = '''ATCGGACTTTACCATCCAATGGATCGGACTTTACCATCCAATGGATCGGACTTTACCATCCAATGGATCGGACTTTACCATCCAATGGATCGGACTTTACCATCCAATGGATCGGACTTTACCATCCAATGGATCGGACTTTACCATCCAATGG'''
使用python内置的find或index方法只能找到特定字符首次出现的位置
h.index('GC')
我们想找到所有的AC区域
for m in re.finditer('AC',h):
print (m.span(),m.group())
网友评论