Python中正则表达式(re模块)的使用(4)

finditer()函数与findall函数类似,但finditer()返回的是一个可迭代的对象。
import re
s = 'This and that'
print(re.findall(r'(Th\w+) and (th\w+)', s, re.I))
print(re.finditer(r'(Th\w+) and (th\w+)', s, re.I).__next__().groups()) #调用返回值
print(re.finditer(r'(Th\w+) and (th\w+)', s, re.I).__next__().group(1))
it = re.finditer(r'(Th\w+)', s, re.I)  #生成一个生成器对象
g = it.__next__()  #调用
print(g.groups())  #打印出This,以元组的形式
print(g.group(1))
g = it.__next__()  #再次调用
print(g.groups())  #打印出that
#将匹配到的内容生产一个列表,列表中包含两个元组
print([g.groups(1) for g in re.finditer(r'(Th\w+)', s, re.I)])

(7)使用sub()和subn()搜索替换
sub()只替换搜索到的内容,subn()不但替换搜索到的内容,并返回替换的次数。
import re
print(re.sub("g.t","have",'I get A, I got B,I gut C'))  #对匹配到的单词替换
print(re.subn("g.t","have",'I get A, I got B,I gut C')) #对匹配到的单词替换,并返回替换次数
print(re.sub('[bd]','Y','abcdef'))
print(re.subn('[bd]','Y','abcdef'))    #对字符串替换,并打印替换的字符串的的次数

分组和替换的综合应用(替换日期的表示方法):
import re
import time,datetime
day1 = str(datetime.date.today())
print(day1)
#将月/日/年的时间格式转化成“日/月/年”,将r加在左引号之前,主要目的是为了避免转义特殊字符串字符
print(re.sub(r'(\d{1,2})/(\d{1,2})/(\d{2}|\d{4})', r'\2/\1/\3', '05/06/2017'))
print(re.sub(r"(\d{2}|\d{4})-(\d{1,2})-(\d{1,2})", r"\3/\2/\1", day1))

(8)使用split分割字符串
import re
print(re.split('\d+','one1two2three3,for4')) #以匹配到的数字对字符串以“,”进行分割

4、正则表达式的应用
(1)对Linux系统who命令输出内容进行处理
将Linux系统who命令输出结果保存到whodata.txt中:

[root@linuxidc ~]# cat whodata.txt
liu2    :0          2017-04-17 22:10 (:0)
liu2    pts/0        2017-04-17 22:11 (:0)
root    pts/1        2017-05-05 03:51(172.16.252.112)
root    pts/2        2017-05-05 03:51(172.16.252.112)
root    pts/3        2017-05-05 03:52 (172.16.252.112)
对who命令输出的内容进行处理:
import re
f = open('whodata.txt','r')
for line in f:   
    #对匹配到的行的内容以逗号分隔,将每一行的内容分别存到一个列表中
    print(re.split(r'\s\s+',line.rstrip())) 
f.close()


使用findall()函数处理win下tasklist命令:
import os
import re
f = os.popen('tasklist /nh', 'r')
for line in f:
    print(re.findall(r'([\w.]+(?:[\w]+)*)\s\s+(\d+) \w+\s\s+\d+\s\s+([\d,]+ K)', line.rstrip())) 
    #读取每一行中自己需要的数据
 
f.close()

(2)生成用于正则表达式练习的数据
#!/usr/bin/env python
from random import randrange,choice
from stringimport ascii_letters as lc
from sys import maxsize
from time import ctime
 
tlds = ('com','deu','net','org','gov')
for i in range(randrange(5,11)):
    dtint = randrange(maxsize)        #生成一个随机数字组
    #在属组中取一个6到十位的随机数作为时间戳生成一个日期
    dtstr = ctime(int(str(dtint)[0:randrange(6,10)])) 
    llen = randrange(4,8)  #生成一个4-8的随机数字
    login = ''.join(choice(lc) for j in range(llen)) #生成邮箱@符号前的字符
    dlen = randrange(llen,13)
    dom = ''.join(choice(lc) for j in range(dlen))  #生成@后的字符,长度有dlen来决定
    #choice(tlds)为在tlds总随机选择一个域名后缀
    print('%s::%s@%s.%s::%d-%d-%d' % (dtstr,login,dom,choice(tlds),dtint,llen,dlen))

将上面生成的数据保存到一个文件中用于后面练习:
#!/usr/bin/env python
import re
with open('gendata.txt','r') as f:
    for line in f:
        patt = '.+(\d+-\d+-\d+)' #为贪婪匹配,匹配前面为任意字符,后面组中为如“5-7-10”的数据
        print(re.match(patt, line).group(1))       
        '''"?"要求正则表达式引擎匹配尽可能少的字符,在"+","*","?"后使用可达到预期效果'''
        patt1= '.+?(\d+-\d+-\d+)' #通过"?",匹配到了符合分组中的所有字符串
        print(re.match(patt1, line).group(1))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/a8c545851c5d78c36f9a94fd2e5f28ba.html