1,正则表达式
正则表达式是用来做字符串的匹配的,正则有他自己的规则,和python没有关系,一种匹配字符串的规则。
2,字符组
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示。 字符分为很多类,比如数字、字母、标点等等。 假如你现在要求一个位置"只能出现一个数字",那么这个位置上的字符只能是0、1、2...9这10个数之一。
3,检索输入的手机号是否合法
#检测输入的手机号是否合法 while True: phone_number = input('please input your phone number : ') if len(phone_number) == 11 \ and phone_number.isdigit()\ and (phone_number.startswith('13') \ or phone_number.startswith('14') \ or phone_number.startswith('15') \ or phone_number.startswith('18')): print('是合法的手机号码') else: print('不是合法的手机号码')
4,换一种方法:调用re模块来检测手机号是否合法
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('不是合法的手机号码')
5,正则表达式规则
字符:
量词
6,转义符转义符在python和正则表达式当中有着特殊的含义,如:\n,在python中表示换行符,如果想单纯的输出\n直接输出是没办法实现的。下边就是一些实现输出转义符的方法。
正则 | 带匹配字符 | 匹配结果 | 说明 |
\n | \n | False |
因为在正则表达式中\是有特殊意义的字符,所以要匹配\d本身,用表达式\d无法匹配 |
\\n | \n | True |
转义\之后变成\\,即可匹配 |
\\\\n | \\n | True |
如果在python中,字符串中的'\'也需要转义,所以每一个字符串'\'又需要转义一次 |
r'\\d' |
r'\d' |
True |
在字符串之前加r,让整个字符串不转义 |
正则表达式测试:http://tool.chinaz.com/regex/
7,贪婪匹配
1)什么是贪婪匹配?
在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配。如:*,重复零次或更多次,默认为贪婪匹配,所以会默认匹配更多次,更不是零次。
正则 | 待匹配字符 | 匹配结果 | 说明 |
<.*> | <script>...<script> | <script>...<script> |
默认为贪婪匹配模式,会匹配尽量长的字符串 |
<.*?> | r'\d' | <script> <script> |
加上?为将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串 |
2)?的在正则中的用法总结:
量词:匹配零次或一次
放在量词之后:惰性运算
放在分组里:取消分组优先
3)几个常用的非贪婪匹配Pattern
*? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复
8,re模块的常用方法
findall返回所有匹配结果放在列表中
findall('前面放药查找的内容','这里放被查找的内容')
search从前往后找到一个就返回,且返回一个结果的对象(变量),返回的变量需要调用.group()获取结果。,没有就返回None,调用group()会报错
search('前面放要查找的内容','这里放被查找的内容')
match和search的用法完全一样,match是从头开始匹配,如果正则规则从头开始找一个可以匹配上,就返回一个变量。匹配的内容需要用group才能显示,没有匹配上就返回None,调用match会报错。
match(‘前面放要查的内容’,‘这里放被查找的内容’)
split根据正则关系进行split。
split('正则规则','被替换内容')
ret=re.split("\d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan']
加分组之后:
ret=re.split("(\d+)","eva3egon4yuan") print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan']
sub:替换
sub('正则规则','替换的内容',‘被替换的内容’,替换数量)
subn
(‘正则规则’,‘替换的内容’,‘被替换的内容’)
#返回的结果是(‘正则规则’,‘替换的内容’,‘被替换的内容’,替换次数)
finditer('正则规则',‘被查找内容’)
#返回一个存放匹配结果的迭代器
对于finditer和split来说,如果他们的正则表达式中有分组,分组内容优先