初识python 之 爬虫:正则表达式
语法
python中正则表达式功能由 re 模块提供: import re
两个主要函数:
match 匹配第一个字符(从第一个字符开始匹配)
search 匹配整个字符串
一、匹配单个字符
1、匹配某个字符(串)
text = 'hello' ret = re.match('hel',text) # 从字第1个字符开始匹配,若不匹配就不会匹配到数据 # ret = re.search('l',text) # 在整个字符串中查找是否存在此字符 print(ret.group()) # hel
2、. 匹配任意字符,不能匹配到换行符 \n (指定flags=re.DOTALL 可匹配任何字符)
text = 'abc hello' ret = re.match('.',text) # 匹配第一个字符 print(ret.group()) # a
3、\d 匹配任意的数字
text = '0a1' ret = re.match('\d',text) # 匹配任意的数字 print(ret.group()) # 0
4、\D 匹配任意的非数字
text = 's0a1' ret = re.match('\D',text) # 匹配任意的非数字 print(ret.group()) # s
5、\s 匹配任意空白字符(\n,\t,\r,空格)
text = '\ns0a1' ret = re.match('\s',text) # 匹配任意空白字符 print(ret.group()) # 换行符
6、\w 匹配a-z、A-Z、数字、下划线
text = '2s0a1' ret = re.match('\w',text) # 匹配a-z或A-Z、数字、下划线 print(ret.group()) # 2
7、\W 匹配和\w相反的字符
text = '$s0a1' ret = re.match('\W',text) # 匹配a-z和A-Z、数字、下划线 print(ret.group())
8、[]组合的方式,满足中括号中的字符,就能匹配到
a.匹配a或1
text = '1a1' ret = re.match('[a1]',text) # 匹配a或1 print(ret.group()) # 1
b.匹配数字、- 匹配一个:0
text = '028-888888' ret = re.match('[\d\-]',text) # 匹配数字、- 匹配一个:0 print(ret.group())
c.匹配数字、- 匹配多个:028-888888
text = '028-888888dd' ret = re.match('[\d\-]+',text) # 匹配数字、- 匹配多个:028-888888 print(ret.group())
d.中括号形式代替\d
text = '02334' ret = re.match('[0-9]',text) # 匹配0-9的数字 print(ret.group()) # 0
e.中括号形式代替\D
text = 'g02334' ret = re.match('[^0-9]',text) # 匹配非0-9的字符 print(ret.group()) # g
f.中括号形式代替\w
text = 'G02334' ret = re.match('[a-zA-Z0-9_]',text) # 匹配a-z和A-Z、数字、下划线 print(ret.group()) # G
g.中括号形式代替\W
text = '%02334' ret = re.match('[^a-zA-Z0-9_]',text) # 匹配非a-z和A-Z、数字、下划线 print(ret.group()) # %
二、匹配多个字符
1、* 匹配0或多个字符
text = '028' ret = re.match('\d*',text) # 匹配任意多个数字 print(ret.group()) # 028
2、+ 匹配1个或多个字符
text = 's0\ta1' ret = re.match('\w+',text) # 匹配1个或多个字符 print(ret.group()) # s0
3、? 匹配0个或1个字符
text = '@s0\ta1' ret = re.match('\w?',text) # 匹配0个或1个字符 print(ret.group()) # 匹配到0个
4、{m} 匹配m个字符(或表达式)
text = 'a2daf' ret = re.match('\w{2}',text) # 匹配2个字符(或表达式) print(ret.group()) # a2
5、{m,n} 匹配m至n个字符
text = 'a2daffdsdf' ret = re.match('\w{2,5}',text) # 匹配2到7个字符个字符 print(ret.group()) # a2daf
三、常用案例
1、验证手机号码:1开头,第二位34578中任意一位,后面9位任意数字
text = '15123456789' ret = re.match('1[34578]\d{9}',text) # text = '1512345678' # 后面只有8位,不能匹配到 print(ret.group()) # 15123456789
2、验证邮箱
text = 'dasd1231@qq.com' ret = re.match('\w+@[a-z0-9]+\.[a-z]+',text) print(ret.group()) # dasd1231@qq.com
3、验证url
text = 'http://www.baidu.com' ret = re.match('(http|https|ftp)://[^\s]+',text) # | 或的意思 print(ret.group()) # http://www.baidu.com
4、验证身份证,一共18位,最后一位可能是数字,x,X
text = '12345678901234567x' ret = re.match('\d{17}[xX\d]',text) print(ret.group()) # 12345678901234567x
5、^(脱字号) 以什么开始
text = 'sdfsdg' ret = re.match('^s',text) # 以s开头 print(ret.group()) # s
6、$ 以什么结尾
text = 'sdfsdg.com' ret = re.search('\w+.com$',text) # 以.com结尾 print(ret.group()) # sdfsdg.com
7、| (或的意思) 匹配多个表达式或字符串
text = 'sdfsdg.cndas' ret = re.search('\w+(.com|.cn)',text) # 以.com或.cn 结尾 print(ret.group()) # sdfsdg.cn
8、? 贪婪模式和非贪婪模式:
贪婪模式:正则表达式会匹配尽量多的字符。默认是贪婪模式。
非贪婪模式:正则表达式会尽量少的匹配字符。
a.贪婪模式
text = '2342334' ret = re.search('\d+',text) # 匹配任意个数字 print(ret.group()) # 2342334
text = '<b> dasd </b>' ret = re.search('<.+>',text) # 匹配任意个字符 print(ret.group()) # <b> dasd </b>
b.非贪婪模式
text = '2342334' ret = re.search('\d+?',text) # 匹配最少个数数字 print(ret.group()) # 2
text = '<b> dasd </b>' ret = re.search('<.+?>',text) # 匹配最少字符 print(ret.group()) # <b>
c匹配0-100之间的数字
text = '34' ret = re.match('0?$|[1-9]\d?$|100$',text) # 匹配最少个数数字 print(ret.group()) # 34
四、转义字符、原生字符串
转义字符:某些字符前面加\表示特殊意义,例:
print('\n') # 输出换行
原生字符串:字符串前面加上 r 表示原生字符串,例:
print(r'\n') # 输出 \n,而不是换行
特例:输出 \n
转义字符格式:
text = '\\n' ret = re.match('\\\\n',text) # 转义字符格式 print(ret.group()) # \n
原生字符格式:
text = '\\n' ret = re.match(r'\\n',text) # 原生字符 print(ret.group()) # \n
五、re模块中常用函数
1、group :提取分组截获的字符串,使用()分组
通过实例说明:
text = 'sasdd $99 fsdf $88' ret = re.search('.*(\$\d+).*(\$\d+)',text) print(ret.group()) # 获取整个匹配结果 和 print(ret.group(0) 一样 print(ret.group(1)) # 获取第一个分组 $99 print(ret.group(2)) # 获取第二个分组 $88 print(ret.group(1,2)) # 获取第一、二个分组 ('$99', '$88') print(ret.groups()) # 获取所有子分组
2、findall 找出所有满足条件的,返回一个列表。
text = 'sasdd $99 fsdf $88' ret = re.findall('\$\d+',text) print(ret) # ['$99', '$88']
3、sub 将匹配到的字符串替换为其他字符串。
a.将$替换成¥
text = 'sasdd $99 fsdf $88' ret = re.sub('\$','¥',text) print(ret) # sasdd ¥99 fsdf ¥88
b.剔除掉所有的html标签符号及其内容
html = ''' <div class="abc"> <p>第1段</p> <p>第2段</p> <p>第3段</p> ''' ret = re.sub('<.+?>','',html) print(ret) # 返回 ''' # 第一个换行符替换成空 # <div class="abc"> 替换成空 第1段 第2段 第3段 '''
4、split:使用正则表达式来分割字符串,返回列表
a.使用空格分割
text = 'sds sfaff 1214' ret = re.split(' ',text) print(ret) # ['sds', 'sfaff', '1214']
b.使用数字分割
text = 'sds32sfaff23ffsf' ret = re.split('\d+',text) print(ret) # ['sds', 'sfaff', 'ffsf']
5、compile 提前定义(编译)好正则,后续直接使用。
指定flag=re.VERBOSE时,可添加注释信息。
a.获取 $20.50
text = "asd sddfe fefe $20.50" r = re.compile('\d+\.?\d*') ret = re.search(r,text) print(ret.group())
b.获取 $20.50,并添加注释信息
text = "asd sddfe fefe $20.50" r = re.compile(r''' \d+ # 小数点前面的数字 \.? # 小数点,小数点可有可无 \d* # 小数点后面的数字,小数点后面数字可有可无 ''',re.VERBOSE) ret = re.search(r,text) print(ret.group())
案例
初识python之 正则案例:找到记录中所有user_name的值
posted on 2019-08-01 16:27 Simple-Sir 阅读(312) 评论(0) 编辑 收藏 举报