一文学会正则表达式
目录
每天与你分享编程知识。
本篇文章将带大家一文搞懂正则表达式
1.什么是正则表达式
正则表达式(Regular Expression)
正则表达式是一种字符串匹配规则,用于字符串匹配。
2.单字符
a-z
A-Z
0-9
d
匹配0-9任意一个数字
D
匹配除0-9以外的任意一个字符
w
匹配数字、字母、下划线
W
匹配非数字、字母、下划线
s
匹配空白字符
S
匹配非空白字符
.
除了n
以外的任意一个字符
[]
匹配中括号中任意一个字符
[^]
匹配除中括号中以外任意一个字符
3.量词
*
任意次, 可以是0次
+
1次 或 多次
?
0次 或 1次
{m}
匹配前一个字符的重复次数为m次
4.其他
$
结尾处 边界处理
^
起始处 边界处理
b
单词边界
B
非单词边界
|
或者
()
分组
上面这种分类是小编觉得比较容易理解的一种分类,在看其他文档或资料的时候,并不一定是这样划分的。
5.实战演练
这里以python
语言为例,详解正则表达式的使用。
在python
语言中,需要导入一个re
模块才能使用正则表达式
导入re
模块
import re
python正则表达式语法非常简洁
主要有以下几个方法
re.match()
从字符串起始位置从左往右检索,如果匹配不到则停止检索
re.search()
从字符串任意位置从左往右检索,匹配到则停止
re.findall()
从字符串起始位置从左往右检索,找到所有符合的字符串,返回一个列表
re.split()
字符串分割
re.sub()
正则替换
re.compile()
编译
下面看一个实际案例
电话号码匹配
电话号码为数字,且长度为11位
str_ = "我的电话号码是18888888888, 有事情随时打给我"
res = re.match("d{11}", str_) # 匹配11个数字
print(res) # None
d
代表0-9任意一位数字,但为什么这里匹配不到呢?原因是match
方法是从字符串的起始位置开始匹配的,str_
字符串的起始位置是”我的电话…”,所以就匹配不到。如果想要从字符串的任意位置开始匹配,就需要使用search
方法。
示例代码如下:
import re
str_ = "我的电话号码是16888888888, 有事情随时打给我"
res = re.search("d{11}", str_) # 匹配11个数字
print(res) #
可以看到,当替换成search
方法后,可以获取到匹配到结果,但并不是16888888888
。如果想要拿到匹配的字符串,需要使用res.group()
获取
示例代码如下:
import re
str_ = "我的电话号码是16888888888, 有事情随时打给我"
res = re.search("d{11}", str_) # 匹配11个数字
print(res.group()) # 16888888888
请思考一个问题,16888888888
这个号码存在?显然是不存在的,所以我们还需要对号码做限制。
要求如下:
第一位必须是1
第二位必须是3或4或5或7或8
其他位置为0到9中任意一个
那这个正则表达式如何书写呢?请看以下示例
import re
str_ = "我的电话号码是16888888888, 有事情随时打给我"
res = re.search("1[34578]d{9}", str_) # 电话号码匹配
print(res) # None
[]
代表匹配中括号中任意一个字符。我们对号码做了限制,第1位必须是数字1,第2位必须是3 | 4 | 5 | 7 | 8, 第3到11位,数字可以是0-9任意一个。
可以看到,打印结果为None,因为第二位数字并不符合要求。
现在好像很完美了,但还存在一些小问题。请看以下代码
import re
str_ = "我的电话号码是18888888888999, 有事情随时打给我"
res = re.search("1[34578]d{9}", str_) # 匹配11个数字
print(res.group()) # 18888888888
上面依旧可以匹配到,但显然18888888888999
并不是一个号码,因此还需要做进一步的限制。示例代码如下
import re
str_ = "我的电话号码是18888888888999, 有事情随时打给我"
res = re.search("1[34578]d{9}[^d]", str_) # 匹配11个数字
print(res) # None
限制11位数字后面不能再是数字,如果是数字就匹配不到。
那这样就完美了?请看以下代码
import re
str_ = "我的电话号码是18888888888, 有事情随时打给我"
res = re.search("1[34578]d{9}[^d]", str_) # 匹配11个数字
print(res.group()) # 18888888888,
无缘无故多匹配了一个,
这种结果并不是我们想要的,如何处理呢?
import re
str_ = "我的电话号码是18888888888, 有事情随时打给我"
res = re.search("(1[34578]d{9})[^d]", str_) # 匹配11个数字
print(res.group()) # 18888888888,
print(res.group(1)) # 18888888888
只需要将想要匹配的部分用()
括起来。想要获取结果的时候,需要这样取,res.group(1)
()
代表分组的意思。
这样就完美了吗?如果号码18888888888前面也是数字呢?
import re
str_ = "我的电话号码是22222218888888888, 有事情随时打给我"
res = re.search("(1[34578]d{9})[^d]", str_) # 匹配11个数字
print(res.group(1)) # 18888888888
看到这里,或许你已经知道如何解决了,示例代码如下
import re
str_ = "我的电话号码是22222218888888888, 有事情随时打给我"
res = re.search("[^d](1[34578]d{9})[^d]", str_) # 匹配11个数字
print(res) # None
这样我们就保证了手机号码格式的正确性
或许你曾见过过别人是这样写的
import re
str_ = "我的电话号码是22222218888888888, 有事情随时打给我"
res = re.search("^1[34578]d{9}$", str_) # 匹配11个数字
print(res) # None
这里为什么反而匹配不到呢?前面已经说过^
代表字符串的起始位置,$
代表字符串的结束位置。str_
字符串的起始位置是1? 结束位置是数字0-9任意一个? 显然不是呀!
我们换一个字符串,就可以匹配到啦
import re
str_ = "18888888888"
res = re.search("^1[34578]d{9}$", str_) # 匹配11个数字
print(res)
这个正则表达式(^1[34578]d{9}$)一般用于表单验证。就是为了防止用户乱输手机号,限制用户必须输入11位数字,且格式必须符合要求。(结合上面的案例,体会一下……)
以上就是本篇文章的全部内容啦!
6.总结
本篇文章详细介绍了什么是正则表达式,以及正则表达式在python中的使用等内容。并通过一个实际案例将大部分知识点穿插应用。
附:
各大运营商手机格式
-
移动:134、135、136、137、138、139、147(无线上网卡)、150、151、152、157、158、159、182、183、187、188、178
-
联通:130、131、132、145(无线上网卡)、155、156、185(iPhone5上市后开放)、186、176(4G号段)175(2015年9月10日正式启用,暂只对北京、上海和广东投放办理)
-
电信:133、153、180、181、189、177、173、149
正则表达式在线测试网址
https://rubular.com/
https://www.regexpal.com
送福利了!关注下方的公众号:“优派编程”,搜索关键词“下载”,即可获得软件app下载资源和python、java等编程学习资料~
更多课程和学习资料请登录“方包博客”———http://fang1688.cn
更多资源请关注公众号或点击下方“阅读原文”,回复关键词获取