1. 正则表达式
1.正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
2.正则不属于任何语言,大多数语言都提供了正则的支持;正则是一种模式的描述,有其特定的描述符 3.学习正则分两步: 1.了解正则的描述符(修饰符): 其中最主要的两个是 (1)re.I 使匹配对大小写不敏感; (2)re.M 多行匹配,影响 ^ 和 $ 2.掌握特定语言的方法或函数: re模块python3使用正则表达式:
- re.match()函数 函数语法:re.match(pattern, string, flags=0) 其中:
- pattern指匹配的正则表达式
- string指要匹配的字符串
- flags指标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 匹配成功re.match方法返回一个匹配的对象,否则返回None。
import re#re.match从开头匹配,匹配成功返回匹配对象,不成功返回Nonere1 = re.match(r'www', 'www.baidu.com', re.I)print(re1) #<_sre.SRE_Match object; span=(0, 3), match='www'>匹配成功,返回的匹配对象print(re1.span()) #span表示调用的区间(从?开始到?结束)
- re.search()函数 函数语法:re.search(pattern, string, flags=0)里边的参数同上 re.search 扫描整个字符串并返回第一个成功的匹配。 例1:
import re#re.search从整个字符串的任意位置开始re2 = re.search(r'com', 'www.baidu.com', re.I)print(re2)
例2:
re2 = re.findall(r'com', 'www.baidu.com,www.qq.com,www.360buy.cn,www.taobao.com', re.I)for e in re2: print(e) #输出的结果: com com comre3 = re.finditer(r'com', 'www.baidu.com,www.qq.com,www.360buy.cn,www.taobao.com', re.I)for i in re3: print(i)#输出的结果:#<_sre.SRE_Match object; span=(10, 13), match='com'>#<_sre.SRE_Match object; span=(21, 24), match='com'>#<_sre.SRE_Match object; span=(50, 53), match='com'>
通过上述两个方法的对比,可以看出:虽然两个函数都可以求出匹配的个数,但是还是有根本的区别:re.findall()函数返回的是本身的个数;re.finditer()函数返回的是匹配的对象的个数
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。检索和替换
语法:re.sub(pattern, repl, string, count=0) 参数:- pattern : 正则中的模式字符串
- repl : 替换的字符串,也可为一个函数
- string : 要被查找替换的原始字符串
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配
实例:
import rephone = "2004-959-559 # 这是一个电话号码"# 删除注释num = re.sub(r'#.*$', "", phone)print ("电话号码 : ", num)# 移除非数字的内容num = re.sub(r'\D', "", phone)print ("电话号码 : ", num)
输出的结果:
电话号码 : 2004-959-559 电话号码 : 2004959559
repl 参数是一个函数
以下实例中将字符串中的匹配的数字乘于 2:
import redef shuang(m): v = int(m.group()) #group()默认的参数和sub()的参数一致 return str(v*2)print(re.sub(r'(\d+)', shuang, 'has 5 give 2 ,give he 1 ,sheng 1'))
输出的结果为:
has 10 give 4 ,give he 2 ,sheng 2
python利用正则表达式爬取数据:
实例:
#抓取数据:from urllib import requesturl = "http://www.kgc.cn/list/"for i in range(1, 3): fname = '230-{0}-6-9-9-0.shtml'.format(i) respone = request.urlopen(url+fname) #print(respone.read().decode('utf-8')) print('开始保存:{0}'.format(fname)) f = open(fname, 'w+', encoding="UTF-8") f.writelines(respone.read().decode('utf-8')) f.close()#爬取有用的数据:import refor i in range(1, 3): fname = '230-{0}-6-9-9-0.shtml'.format(i) f = open(fname, 'r', encoding='UTF-8') f2 = open('data-{0}.txt'.format(i), 'w+', encoding='UTF-8') print(f) htmlStr = f.read() p = r'(.+)' p2 = r'(\d+)' p3 = r'(.+)' rs1 = re.findall(p, htmlStr, re.I | re.M) rs2 = re.findall(p2, htmlStr, re.I | re.M) rs3 = re.findall(p3, htmlStr, re.I | re.M) for n in range(len(rs1)): f2.write("{0} {1} {2}".format(rs1[n], rs2[n], rs3[n])) f2.write('\n') f2.close() f.close()
简单的理解,有什么问题,希望大家提出宝贵的意见和建议……