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除了返回新的字符串之外,还会返回被替换的数目。