本帖最后由 lmt 于 2019-11-18 16:50 编辑
问题一:
"""re 函数
"""
# compile(pattern, flags=0) # 使用任何可选的标记来编译正则表达式的模式,然后返回一个正则表达式对象
# match(pattern, string, flags=0) # 尝试使用带有可选的标记的正则表达式的模式来匹配字符串。如果匹配成功,就返回匹配对象; 如果失败,就返回 None
# search(pattern, string, flags=0) # 使用可选标记搜索字符串中第一次出现的正则表达式模式。 如果匹配成功,则返回匹配对象; 如果失败,则返回 None
# findall(pattern, string, flags=0) # 查找字符串中所有(非重复)出现的正则表达式模式,并返回一个匹配列表
# finditer(pattern, string, flags=0) # 与 findall()函数相同,但返回的不是一个列表,而是一个迭代器。 对于每一次匹配,迭代器都返回一个匹配对象
# split(pattern, string, max=0) # 根据正则表达式的模式分隔符, split函数将字符串分割为列表,然后返回成功匹配的列表,分隔最多操作 max 次(默认分割所有匹配成功的位置)
# sub(pattern, repl, string, count) # 使用 repl 替换所有正则表达式的模式在字符串中出现的位置,除非定义 count, 否则就将替换所有出现的位置( 另见 subn()函数,该函数返回替换操作的数目)
# purge() # 清除隐式编译的正则表达式模式
问题二:
^:匹配行首
$:匹配行尾
.:匹配任意字符(除了\n)
*:匹配前一个字符出现0次或者无限次,即可有可无
[a-z]: 中括号表示匹配[]中列举的字符;实例表示匹配a到z的小写字母
[^0-9]:[^]方括号总的^表示取反的意思,实例表示不匹配0到9的数字
{2,4}:匹配前一个字符出现2至4次
+:匹配前一个字符出现1次或者无限次,至少出现1次
?:匹配前面一个字符出现1次或者0次,即最多1次
问题三:
- \w:匹配单词字符
- \W:匹配非单词字符
- re.match('\w', '_a')
- # <re.Match object; span=(0, 1), match='_'>
复制代码- \b:表示字母数字与非字母数字的边界, 非字母数字与字母数字的边界。
- \B:表示字母数字与(非非)字母数字的边界,非字母数字与非字母数字的边界。
- re.split('123\\b', '==123!! abc123. 123. 123abc. 123')
- # ['==', '!! abc', '. ', '. 123abc. ', '']
复制代码- \d:匹配数字。 即0-9
- \D:匹配非数字,即不是数字
- re.match('\d\d', '123')
- # <re.Match object; span=(0, 2), match='12'>
复制代码- \s:匹配空格, tab键, \n
- \S:匹配非空格
- re.match('\s', ' a')
- # <re.Match object; span=(0, 1), match=' '>
- re.match('\S', ' a')
- # None
复制代码 问题四:贪婪匹配 和 非贪婪匹配D:/youdaonote/m13554221497@163.com/9c7e81729c12420fa69348c367b3afa2/clipboard.png
贪婪匹配:尽可能匹配多的字符串
非贪婪匹配:匹配到结果就好,总是尝试尽可能少的字符。(比较佛系)
- import re
- match_str = 'abcbcedfcdggc'
- pattern1 = r'ab.*c'
- pattern2 = r'ab.*?c'
- # 贪婪匹配
- re.match(pattern1, match_str)
- # <re.Match object; span=(0, 13), match='abcbcedfcdggc'>
- # 非贪婪匹配
- re.match(pattern2, match_str)
- # <re.Match object; span=(0, 3), match='abc'>
复制代码 问题五:正则的compile函数
思想:先将需要匹配的字符串,写成pattern实例;然后使用pattern实例处理文本并获取匹配结果。
用法: re.compile(pattern, flags=0)
- pattern : 一个字符串形式的正则表达式
- flags 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
- <b>re.I 忽略大小写</b>
- re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
- <b>re.M 多行模式</b>
- re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
- re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
- re.X 为了增加可读性,忽略空格和' # '后面的注释
复制代码 练习:
练习一:
- #!/usr/bin/env python
- #-*- coding:utf-8 -*-
- # get gene name
- import re
- import sys
- def get_genename(infile):
- gene_list = []
- if infile.endswith('gz'):
- import gzip
- f = gzip.open(infile, 'r')
- else:
- f = open(infile, 'r')
-
- for line in f:
- if line.startswith('#'):
- pass
- else:
- result = re.search(r'GENE=(.*?);', line)
- if result:
- genename = result.group(1)
- gene_list.append(genename)
- return list(set(gene_list))
- if __name__ == "__main__":
- infile = sys.argv[1]
- get_genename(infile)
复制代码- #!/usr/bin/env python
- #-*- coding:utf-8 -*-
- import re
- import sys
- def check_genetype(infile):
- with open(infile, 'r') as indata:
- header = indata.readline().strip().split('\t')
- s1_pos = header.index('S1')
- s2_pos = header.index('S2')
- pattern_no_mut = re.compile(r'(\./\.)|(0/0)')
- for line in indata:
- lline = line.strip().split('\t')
- s1_info = lline[s1_pos]
- s2_info = lline[s2_pos]
-
- s1_tp = re.search(pattern_no_mut, s1_info)
- s2_tp = re.search(pattern_no_mut, s2_info)
- if not s1_tp and not s2_tp:
- print('共有变异位点: %s\t%s' % (s1_info, s2_info))
- elif not s1_tp and s2_tp:
- print('just s1 have : %s\t%s' % (s1_info, s2_info))
- elif s1_tp and not s2_tp:
- print('just s2 have: %s\t%s ' %(s1_info, s2_info) )
- else:
- print('都没有的突变 %s\t%s' % (s1_info, s2_info))
-
- if __name__ == "__main__":
- infile = sys.argv[1]
- check_genetype(infile)
复制代码
D:/youdaonote/m13554221497@163.com/9c7e81729c12420fa69348c367b3afa2/clipboard.png
|