每天与你分享编程知识。

本篇文章将带大家一文搞懂正则表达式

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

更多资源请关注公众号或点击下方“阅读原文”,回复关键词获取

发表评论

您的电子邮箱地址不会被公开。

1 + 2 =