正则表达式和re模块
正则表达式
它是一门独立的语言,其他语言可以使用正则表达式来做一些功能,主要用于筛选数据(不会写可以百度)
利用一些特殊符号匹配想要的数据就是正则表达式 , 简称正则
1.字符组([ ... ]、\d)
匹配单个字符在多种情况内
[12345] # 匹配1-5之间
[a—z1—9] # 匹配a-z和1-9之间
\d #匹配一个数字
2.字符
1. .
匹配除换行符之外的任意数字
2. \w
匹配字母数字或下划线
3. \n
匹配一个换行符
4. ^
匹配字符串的开始
5. $
匹配字符串的结尾
6. a|b
匹配字符a或者字符b
7. [ ... ]
匹配字符组中的数字
8. \d
匹配数字9. [ ^... ]
匹配除了字符组中字符是的所有字符
10.() 11. \t
匹配括号内的表示式,也表示一个组 匹配一个制表符
12. \b 13. \w
匹配一个单词的结尾 匹配非字母或数字或下划线
14. \D 15. \S
匹配非数字 匹配非空白符
16. \s
匹配空白符
3.量词
1.量词只能影响前面一个字符
2.量词不能单独使用,必须配合其他字符
1. *
重复零次或更多次
2. +
重复一次或者更多次
3. ?
重复零次或一次
4. {n}
重复n次
5. {n,}
重复n次或更多次
6. {n,m}
重复n次到m次
4.贪婪匹配和非贪婪匹配
当使用 . * 进行匹配时,默认匹配就是贪婪匹配,尽可能多的匹配
将贪婪匹配转为非贪婪匹配
. *?
5.补充(转义字符)
\ 一般配合特殊字符使用,当需要使用 \没有特殊含义时就再加一个 \ 进行转义
一个斜杠只能转义一个字符
re模块(
re:regular express
1.re是内置的模块,可以直接使用
2.在python中,要想使用正则需要借助于re模块
import re # 导入re模块
关键字
1.findall
re.findall('正则表达式' ,'待匹配的文件')
匹配到的结果用列表收集,如果没有则为列表
2.search、group
search返回匹配情况,用group取得结果,如果匹配不到的话就会返回,如果匹配到就返回第一个匹配到的字符
None
1 import re 2 res = re.search('a.', 'dsushfiusahafiusahaaciusaa') 3 print(res.group()) # ah 4 res = re.search('cc', 'dsushfiusahafiusahaaciusaa') 5 print(res) # None
3.match
从头开始匹配
分组
1.无名分组
1.用search匹配时如果正则表达式中有分组时,用group取值时,括号内如果不填值时,默认取全部,如果里面填了数字,则按照数字返回分组对应的值
1 import re 2 res = re.search('^[1-9](\d{14})(\d{2}[0-9x]?)$','110105199812067023') 3 print(res) 4 print(res.group()) # 110105199812067023 5 print(res.group(1)) # 10105199812067 6 print(res.group(2)) # 023
2.用findall匹配时如果正则表达式内有分组时,取值时列表内会返回分组的内容,如果有多个分组,则用列表套元组的模式返回。如果要取消分组优先展示,则在分组内前面加一个 ?:即可,也称之为无名分组
1 import re 2 3 res = re.findall('^[1-9](\d{14})(\d{2}[0-9x]?)$', '110105199812067023') 4 print(res) # [('10105199812067', '023')] 5 res = re.findall('^[1-9]\d{14}(?:\d{2}[0-9x]?)$', '110105199812067023') 6 print(res) # ['110105199812067023']
2.有名分组
在正则表达式分组中前方加上 ?P<xxx>,<>括号内填写分组的名字,用search和group取值时,并不改变group原有的取值方式的基础上,group括号可以填写有名分组的名字来取值
1 import re 2 3 res = re.search('^[1-9](\d{14})(?P<month>\d{2}[0-9x]?)$','110105199812067023') 4 print(res.group('month'))