正则表达式简介
'''正则不属于任何一门编程语言,是一门独立的学科,主要用于数据的查找与筛选'''
正则前戏:
需求:编写校验手机号是否合法,使用python代码实现。
1.方式1:使用if嵌套
phone_num = input('请输入您的手机号').strip()
if phone_num.isdigit():
if len(phone_num) == 11:
if phone_num.startswith('13') or phone_num.startswith('15') or phone_num.startswith('18'):
print(phone_num)
else:
print('输入不合法')
else:
print('手机号必须是十一位')
else:
print('请输入纯数字')
2.方式2:re模块用正则表达式
import re
phone_num = input('请输入您的手机号').strip()
if re.match('^[13|15|18][0-9]{9}', phone_num):
print(phone_num)
else:
print('输入不合法')
总结:
正则本质上就是使用一些符号的组合产生一些特殊的含义,然后再去字符串中筛选符合条件的数据。
正则表达式之字符组
正则表达式线上测试网址:http://tool.chinaz.com/regex/
'''字符组(在没有量词修饰)一次只会针对一个数据值'''
[0-9] 匹配[0-9]之间的任意一个数字
[A-Z] 匹配[A-Z]之间的任意一个字母
[a-z] 匹配[a-z]之间的任意一个字母
在中括号中编写的多个数据值彼此都是 或 的关系
[0-9a-zA-Z] 表示数字小写大写字母都能匹配
正则表达式之特殊符号
'''特殊符号(在没有量词修饰)一次只会针对一个数据值'''
| 符号 | 作用 |
|---|
| . | 匹配除换行符之外的任意字符 |
| \w | (小写w)匹配字母或数字或下划线 |
| \W | (大写W)匹配非字母或下划线 |
| \d | 匹配数字 |
| 匹配字符串的开头 |
| $ | 匹配字符串的结尾 |
| ^a$ | 明确限制想要查找的数据值(a) |
| a|b | 匹配字符a或b |
| () | 给正则表达式分组,不影响正则的匹配,用于后续给正则起别名 |
| [] | 匹配字符组中的字符 |
| [^] | 匹配除了字符组中的其他字符 (取反) |
正则表达式之量词
'''在正则表达式中所有的量词都是默认贪婪匹配(尽可能多的匹配)'''
量词不能单独使用,必须跟在表达式的后面,修饰紧挨着的左边的那一个值
| 量词符号 | 作业 |
|---|
| * | 重复零次或更多次(默认尽可能多) |
| + | 重复一次或更多次(默认尽可能多) |
| ? | 重复0次或1次(默认一次) |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
贪婪匹配与非贪婪匹配
待匹配的文本:<script>alert(123)</script>
1.贪婪匹配:<.*>
结果:<script>alert(123)</script>
2.非贪婪匹配:<.*?>
结果:<script> </script>
'''
所有量词默认都是贪婪匹配,但在量词后面加一个?就会变成非贪婪匹配
贪婪匹配一般用 .* 表示
非贪婪匹配一般用 .*? 表示
开始和结束的标志由上述符号两边的表达式决定
'''
取消转义
正则表达式中取消斜杠与字母的特殊含义的方法:在\前面加\
\n ----> \\n
\\n ----> \\\\n
在python中有更加便捷的写法
r'\n'
r'\\n'
re模块常用方法
import re
1.findall
res = re.findall('aa', 'aabbcc aabbcc aaa')
print(res)
2.finditer
res = re.finditer('aa', 'aabbcc aabbcc aaa')
print(res)
print(res.__next__())
3.search
res = re.search('aa', 'aabbcc aabbcc aaa')
print(res)
4.match
res = re.match('aa', '1aabbcc aabbcc aaa')
print(res)
6.compile
obj = re.compile('aa')
print(re.findall(obj, 'ahduqhube1h2qqaa'))
print(re.findall(obj, 'dhqiuahiuaaaihaaa'))
print(re.findall(obj, '111nqaaaaqq1'))
re模块其他操作
1.分组
res = re.findall('ab(c)', 'abcabcabcabc')
print(res)
res = re.findall('ab(?:c)', 'abcabcabcabc')
print(res)
res = re.search('ab(c)', 'abcabcabcabc')
print(res)
print(res.group())
print(res.group(0))
print(res.group(1))
2.别名
res = re.search('a(?P<id>b)(?P<name>c)', 'abcabcabcabc')
print(res.group())
print(res.group(1))
print(res.group('id'))
print(res.group('name'))