REGEX例子

作为REGEX的例子,代码9.3显示了一个给定的文件有多少行,具有给定的模式,通过命令行输入(注:有更有效率的方式来实现这个功能,如Unix下的grep命令,在这里只是给出了另一种方式)。这个程序像下面这样执行:

program_name.py file_name pattern

这里file_name是文件的名字,pattern是需要查找的模式:

列表9.3:计算多少行包含有一个用户给定的模式
1 import re,sys
2 rgx = re.compile(sys.argv[2])
3 counter = 0
4 with open(sys.argv[1]) as fh :
5 for line in fh:
6 if rgx.search(line):
7 counter += 1
8 print (counter)

这个脚本没有记录有多少模式的单词在文件中出现。如果一个单词在同一行中出现多于一次,它只记为一次。下面的脚本对给定模式所有出现进行计数:

1 import re, sys
2 rgx = re.compile(sys.argv[2])
3 counter = 0
4 with open(sys.argv[1]) as fh:
5     for line in fh:
6         ####这一句要不要都行"if rgx.findall(line):"
7         counter += len(rgx.findall(line))
8             
9 print (counter)

 

re.sub

sub(rpl,str[,count=0]): 把rpl替换为字符串(str)来与它定义的REGEX一致。第三个参数是可选的,表示我们想要替代多少次,而默认值是零,这意味着,它取代了所有的出现。这与字符串的replace方法是非常相似,只是后者更换为另一个文本,而不是替换位于一个REGEX的文字。

列表 9.5 删除GC重复(多余三个GC的行)
1 import re
2 rgx = re.compile("(?:GC){3,}")
3 seq = "ATGATCGTACTGCGCGCTTCATGTGATGCGCGCGCGCAGACTATAAG"
4 print ("Before:%s" %seq)
5 print ("After: %s" %rgx.sub("",seq))   ####这里 rgx.sub("",seq) 会自动返回被替换后的新字符串。

这个程序的产物是

Before: ATGATCGTACTGCGCGCTTCATGTGATGCGCGCGCGCAGACTATAAG

After: ATGATCGTACTTTCATGTGATAGACTATAAG

re.subn

subn(rpl,str[,count=0]): 它具有和sub相同的功能,唯一不同是不返回新的字符串,而是返回一个元组,有两个元素:新的字符串和替代数目。当除了替换字符串中的一个模式,还需要知道多少替换已作出时使用此函数。

re.sub和re.subn的区别如下:

>>> seq
'ATATAAGATGCGCGCGCTTATGCGCGCA'

>>> regex = re.compile("(?:GC){3,}")
>>> regex.subn("",seq)
('ATATAAGATTTATA', 2)

>>> regex.sub("",seq)
'ATATAAGATTTATA'

就是说re.subn除了返回新的字符串之外,还会返回被替换的数目。

 

posted @ 2017-01-07 19:10  Bio-Liu  阅读(288)  评论(0编辑  收藏  举报