正则表达式和re模块
一、正则表达式
正则表达式本身也和Python没有什么关系,就是一种匹配字符串内容的一种法则。是一种技术,所有编程语言都可以使用
正则表达式:是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
应用的场景:爬虫、数据分析
在线测试工具 http://tool.chinaz.com/regex/
推荐书籍:《正则指引》
二、正则表达式常用的方法
1、字符组 [ ] :直接匹配单个字符或数字
[0123456789] 待匹配的数字 8 匹配结果为True 说明:字符组中有‘8’的存在所以能匹配出结果
[1221545786] 待匹配的数字 a 匹配结果为Flase 说明:字符组中没有匹配发字符‘a’的存在
[a-z] 对应的ASCII码表 a=97逐一增加,[A--Z] A对应的ASCCII为 65
2、元字符:
两者中间写什么 匹配的字符串就必须是什么
多一个也不想少一个也不行
[^] 除了[]写的字符 其他都要
可以通过在量词后面加上一个 ? 就可以将贪婪匹配变成非贪婪匹配(惰性匹配)
3:量词只能能够限制紧挨着它的那一个正则符号
![](https://img2018.cnblogs.com/blog/1727306/201907/1727306-20190717174318943-1491793546.png)
4、 转义符:\
python中常有很多特殊意义的元字符,如\n \s \r 等,如果想用正则表达式匹配的话就需要转义
\n 变成 \\n \\n变成\\\n
5、贪婪匹配:
在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配,匹配更多的字符
6、非贪婪模式加上 ?,几个常用的 注意:前面的*,+,?等都是贪婪匹配,也就是尽可能匹配,后面加?号使其变成惰性匹配
1:*? 重复任意次,但尽可能少重复
2: +? 重复一次或更多次,但尽可能少重复
3:?? 重复0次或1次,但尽可能少重复
7、.*? 的用法:
1:. 是任意字符
2:*是取0到无限长度
3:?是非贪婪模式
例如: .*?x 就是取前面任意长度的字符,直到一个x的出现
8、常搭配的使用:. ^ s * + ? { } 字符集:[ ] [ ^ ] 分组:( )与或 | [ ^ ]
分组:当多个正则符号需要重复多次的时候或者当做一个整体进行其他操作,那么可以分组的形式
分组在正则的语法中就是()
例子:匹配省份证号码:
身份证号码是一个长度为15或18个字符的字符串,如果是15位则全部有数字组成,首位不能为0;如果是18位,则前17位全部是数字,末位可能是数字或x
^[1-9]\d{13,16}[0-9x]$ :理解:匹配数字以1-9开头的数字 ^[ 1-9 ]\d 重复13到16次 { 13,16 } 筛选以0-9 或 x 为结尾的数字 [ 0-9x ] $
三、re 模块的常用方法:
findall:查找所有 search:搜索 match:相同,使什么相配
搭配正则表达式,导入re一般的写法:
import re # """ # findall # search # match # """
res=re.findall(‘正则表达式’,‘待匹配的字符’) res=re.search(‘正则表达式’,‘待匹配的字符’) res=re.match(‘正则表达式’,‘待匹配的字符’)
1:findall:
import re res=re.findall('[a-z]\w{1,9}','huanqiu lvyou mubiao') print(res) #找出字符串中符合正则表达式全部内容 并且返回的是一个列表,列表中的元素就是正则表达式的结果 import re res1=re.findall('ahj|ahc','ahjhfdjhdjjkdjgjadsdfjd') print(res1)
2、search
import re res=re.search('a','eave kevin james') print(res) # search不会给你直接返回匹配到的结果 而是给你返回一个对象
结果:>> <re.Match object; span=(1, 2), match='a'> 不会直接返回值,要结合res.group()使用才会返回想要匹配法人结果
必须调用group才能看到匹配到的结果
import re res=re.search('a','eave kevin james') print(res.group()) #调用group()才能看到返回的结果
结果:>>> ‘a’
注意:
1.search只会依据正则查一次 只要查到了结果 就不会再往后查找
2.当查找的结果不存在的情况下 调用group直接报错
res1 = re.search('a','eva egon jason') search('正则表达式','带匹配的字符串') if res1: # 避免报错加个条件 print(res1.group())
3、match 和search的使用方法是一样的,要调用group(),但返回的结果不一样
注意:
1.match只会匹配字符串的开头部分
2.当字符串的开头不符合匹配规则的情况下 返回的也是None 调用group也会报错
res = re.match('a','eva egon jason') # print(res) 没有回返回None print(res.group()) # 只找开头的没有就直接报错
四、了解部分:split sub subn compile finditler
1、split 和前面所学的分割是一样的
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd']
结果:['', '', 'cd']
2、sub
ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个 print(ret) #evaHegon4yuan4
>>>> evaHegon4yuan4
3、subn
ret = re.subn('\d', 'H', 'eva3egon4yuan4')#将数字替换成'H',返回元组(替换的结果,替换了多少次) print(ret)
>>> ('evaHegonHyuanH', 3)
4、compile
obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串 print(ret.group())
结果 : 123
5、finditer 和生成式一样用 __next__ 取值
import re ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) #查看第一个结果 print(next(ret).group()) #查看第二个结果 print([i.group() for i in ret]) #查看剩余的左右结果
例子:利用正则表达式匹配电话号码
import re phone_number = input('please input your phone number : ') if re.match('^(13|14|15|18)[0-9]{9}$',phone_number): print('是合法的手机号码') else: print('不是合法的手机号码')
本文来自博客园,作者:游走De提莫,转载请注明原文链接:https://www.cnblogs.com/Gaimo/p/11202575.html