Python 字符串解析与正则表达式

2023-11-14  本文已影响0人  Bioinfor生信云

字符串解析

字符串解析是从一大段信息中,解析出自己需要的内容。比如从下面的字符中解析出序列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())
上一篇 下一篇

猜你喜欢

热点阅读