现在有许多的网站在需要填写手机号的地方都会判断你输入的手机号是否正确,像京东注册的时候。
如果只用python代码来实现
# 1.获取用户的手机号 phone_num = input('请输入您的手机号>>>:').strip() # 2.先校验是否是11位 if len(phone_num) == 11: # 3.再校验是否是纯数字 if phone_num.isdigit(): # 4.校验开头是否合法(随便写几个意思一下) if phone_num.startswith('13' or '15' or '17' or '18'): print('手机号输入正确') else: print('手机号开头不合法') else: print('手机号必须是纯数字') else: print('手机号必须是11位')
如果只使用python代码实现,需要写许多的判断条件,非常麻烦,如果我们用正则表达式来实现
import re phone_number = input('请输入您的手机号>>>: ').strip() if re.match('^(13|14|15|18)[0-9]{9}$', phone_number): print('是合法的手机号码') else: print('不是合法的手机号码')
先别管这串代码是什么意思,只需要知道它用了几行代码就实现了上述的功能,而'^(13|14|15|18)[0-9]{9}$'就是正则表达式,也就是我们接下来要讲述的内容。
正则表达式是一门独立的语言,专门用来匹配、校验、筛查所需的数据,简单的说,就是利用一些特殊符号的组合去字符串中筛选出想要的数据。
正则表达式任何编程语言都可以使用,在python中如果想用就必须借助于内置模块re。
在正则表达式中,中括号[ ]的用处很大,字符串会一一匹配里面的字符,符合就返回符合的结果。
正则表达式 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
[1234] | Aa1b2b5Z | 1 2 |
匹配1、2、3、4任意一个数字 |
[0123456789] | Aa1b2b5Z | 1 2 5 |
匹配0到9任意一个数字 |
[0-9] | Aa1b2b5Z | 1 2 5 |
匹配0到9任意一个数字 |
[a-z] | Aa1b2b5Z | a b b |
匹配a到z任意一个小写字母 |
[A-Z] | Aa1b2b5Z | A Z |
匹配A到Z任意一个大写字母 |
[2-9a-fA] | Aa1z2 | A a 2 |
匹配2到9、a到f的小写字母、大写字母A任意一个 |
特殊字符 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\W | 匹配非字母或数字或下划线 |
\s | 匹配任意的空白符 |
\S | 匹配非空白符 |
\d | 匹配数字 |
\D | 匹配非数字 |
\n | 匹配一个换行符 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
a|b | 匹配字符a或字符b |
() | 匹配括号内的表达式,也表示一个组 |
[] | 匹配字符组中的字符 |
[^...] | 匹配除了字符组中字符的所有字符 |
特殊字符案例
正则表达式 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
a. | asd13abe | as ab |
匹配两个字符,第一个必须要为a,第二个除换行符以外的任意字符 |
^ab | abd | ab | 匹配ab,并且ab要在开头 |
^ab | asd | 无 | 匹配ab,并且ab要在开头 |
ab$ | 123aab | ab | 匹配ab,并且ab要在结尾 |
ab$ | 123aas | 无 | 匹配ab,并且ab要在结尾 |
[^ab] | ad1b2 | d 1 2 |
匹配除a、b以外的所有字符 |
量词 | 说明 |
---|---|
* | 重复前面的表达式零次或多次,默认多次 |
+ | 重复前面的表达式一次或多次,默认多次 |
? | 重复前面的表达式零次或一次,默认一次 |
{n} | 重复前面的表达式n次 |
{n,} | 重复前面的表达式n次或更多次 |
{n,m} | 重复前面的表达式n到m次 |
量词案例
正则表达式 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
a.{2} | a3cab | a3c | 匹配"a"后面二个任意字符,相当于a.. |
a.{1, 2} | a3cab | a3c ab |
匹配"a"后面一个到二个任意字符 |
a.* | a3cab | a3cab | 匹配"a"后面零个到多个任意字符 |
a.? | a3cab | a3 ab |
匹配"a"后面零个或一个任意字符 |
在量词当中,默认都是贪婪匹配,就是尽可能的匹配更多的字符,像{1,3}就会尽量去匹配3个字符,这个叫做贪婪匹配。
如果想要尽可能匹配更少的字符,只需要在量词后加上'?'即可,这次匹配就会变成非贪婪匹配。
正则表达式 | 待匹配字符 | 匹配结果 | 说明 |
---|---|---|---|
a.*? | a3cab | a a |
匹配"a"后面零个任意字符 |
a.{1, 2}? | a3cab | a3 ab |
只匹配"a"后面一个任意字符 |
a.+? | a3cab | a3 ab |
只匹配"a"后面一个任意字符 |
<.*> | <c1>ale<c2> | <c1>ale<c2> | 匹配"<"后面任意个字符,并且结尾为">" |
<.*?> | <c1>ale<c2> | <c1> <c2> |
匹配"<"后面任意个字符直到遇见第一个">" |
如果在正则表达式中就想匹配像'\n'这样会转义的字符,正常情况下,它不会以字符串的形式出现,而是以转义符出现,为了让它失去转义的意义,可以在前面加一个'\'符号。
正则表达式 | 待匹配字符 | 匹配结果 |
---|---|---|
\\n | asd\n12 | \n |
但是在python中,只需要在字符串前加一个字母'r'即可。
在python中是无法使用正则表达式的,所以我们需要借助re模块。
导入re模块
import re
findall()方法
""" 语法结构: re.findall(正则表达式, 待匹配字符串) """ # 作用:返回所有符合条件的数据,并且组织成了列表 res = re.findall('a.', 'ab1cata1b') print(res) # 输出:['ab', 'at', 'a1']
search()方法
""" 语法结构: re.search(正则表达式, 待匹配字符串) """ # 作用:查找到一个符合条件的数据就结束,没有则返回None res = re.search('a.', 'ab1cata1b') print(res) # <_sre.SRE_Match object; span=(0, 2), match='ab'> # 需要调用group()输出,没有符合条件调用会报错 print(res.group()) # 输出:ab
match()方法
""" 语法结构: re.match(正则表达式, 待匹配字符串) """ # 作用:从字符串的开头匹配,如果没有则直接返回。相当于给正则表达式自动添加了'^'符号 res = re.match('a.', 'ab1cata1b') print(res) # <_sre.SRE_Match object; span=(0, 2), match='ab'> # 需要调用group()输出,没有符合条件调用会报错 print(res.group()) # 输出:ab
finditer()方法
""" 语法结构: re.finditer(正则表达式, 待匹配字符串) """ # 作用:与findall相同,但是返回值是一个迭代器对象 res = re.finditer('a.', 'ab1cata1b') print(res) # <callable_iterator object at 0x0000028A08A7C400> """返回的是一个迭代器对象"""
compile()方法
""" 语法结构: re.compile(正则表达式) """ # 作用:提前包装好后续需要经常使用的正则表达式 obj = re.compile('a.') print(re.findall(obj,'ab1cata1b')) """写一遍之后,直接反复调用即可"""