深入Python中的正则表达式
正则表达式应用的场景也非常多。常见的比如:搜索引擎的搜索、爬虫结果的匹配、文本数据的提取等等都会用到,所以掌握甚至精通正则表达式是一个硬性技能,非常必要。
正则表达式
正则表达式是一个特殊的字符序列,由普通字符和元字符组成。元字符能帮助你方便的检查一个字符串是否与某种模式匹配。
Python中则提供了强大的正则表达式处理模块,即 re 模块, 为Python的内置模块。
下面,我带大家来一个入门demo例子,代码如下:
import re
reg_string = "hello9527python@wangcai.@!:xiaoqiang"
reg = "hello"
result = re.findall(reg,reg_string)
print(result)
复制代码
这里reg_string就是我们的普通字符,reg就是我们的元字符。
我们使用 re 模块中的findall函数,进行匹配,返回的结果是列表数据类型。
我们使用正则表达式,就是为了在很长的字符串中,找到我们需要的字符串片段。
元字符
Python中常见元字符及其含义如下:
元字符 | 含义 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配数字字母下划线汉字 |
\s | 匹配任意空白符 |
\d | 匹配所有的数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的开始结束 |
下面,我们具体使用下Python中的常见的元字符。 |
我们还是使用上次的例子,这次我们需要在reg_string匹配出我们的数字,只需要将reg换成\d,代码如下图所示。
比如,我们在之前的reg的hello前面加上一个^,意味着我们 匹配字符串的开始的hello,那么结果就是一个,就是我们开头的hello。
如果,我们把reg换成\w,代码如下图所示。
这样就是匹配数字字母下划线,包括我们的汉字。
反义代码
Python中常见反义代码 及其含义如下:
反义代码 | 含义 |
---|---|
\W | 匹配任意不是数字字母下划线汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配非数字 |
\B | 匹配不是单词的开始或结束 |
[^a] | 匹配除了a以外的任意字符 |
[^abcd] | 匹配除了abcd以外的任意字符 |
其实,记忆很简单,我们是不是知道\d匹配数字,那么\d的大写\D就是匹配非数字,元字符[a]匹配a任意字符,那么[^a]就是匹配除了a以外的任意字符。
下面是具体例子
>>> import re
>>> reg_string = "hello9527python@wangcai.@!:xiaoqiang"
>>> reg = "\D"
>>> re.findall(reg,reg_string)
['h', 'e', 'l', 'l', 'o', 'p', 'y', 't', 'h', 'o', 'n', '@', 'w', 'a', 'n', 'g', 'c', 'a', 'i', '.', '@', '!', ':', 'x', 'i', 'a', 'o', 'q', 'i', 'a', 'n', 'g']
>>> reg = "[^a-p]"
['9', '5', '2', '7', 'y', 't', '@', 'w', '.', '@', '!', ':', 'x', 'q']
复制代码
限定符
什么是限定符?就是限定我们匹配的个数的东西。
Python中常见限定符 及其含义如下:
限定符 | 含义 |
---|---|
* | 重复零次或多次 |
+ | 重复一次或多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n次到m次 {1,3} |
我们还是用我们之前的reg_string,这次我们限定了元字符为\d{4},也就是我们的匹配的数字必须是4个。
下面,我们来提高难度,匹配字母和数字,限定个数为4个。
这样我们可以使用[0-9a-z]{4},作为我们的元字符,[0-9a-z]代表了0到9的十个数字和a到z的小写26个英文字母。[0-9a-z]{4}限定了个数为4个。
我们打印输出下。
如果遇到了不是在[0-9a-z]范围内,就会跳过,直到后面的4个都是在[0-9a-z]范围内就打印输出。
匹配ip地址
在互联网中,一台主机只有一个IP地址。IP地址用于在TCP/IP通信协议中标记每台计算机的地址,通常用于十进制来表示,如192.168.1.100。
在window系统中,我们可以通过ipconfig查看我们的ip。在linux系统中,我们可以通过ifconfig查看我们的ip。
我们的ip字符串是这样子的:ip = "this is ip:192.168.1.123 :172.138.2.15"
下面要求使用正则表达式,将ip匹配出来。
其实,我们主要编写元字符。比如:reg = "\d{3}.\d+.\d+.\d+",
因为第一个数字必须是三位数开头,我们可以设定\d{3}
固定起来。
reg = "(\d{1,3}.){3}\d{1,3}"。
这元字符中的\d{1,3}
.指定是我们ip前三个数字,后面加{3}
就是重复3次。\d{1,3}
指的就是我们ip最后一个数字。
但是search和findall是有区别的,search只能匹配第一个,我们需要使用列表取出第一个,而findall匹配所有。
组匹配
什么是组匹配,比如说这里边我有一个字符串s = this is phone:13888888888 and this is my postcode:012345
,我需要你把手机号和验证码匹配出来。
因为,我们要匹配两个,而已每个的元字符都是不一样的。所以,我们需要分组匹配。
正则表达式的括号表示分组匹配,括号中的模式可以用来匹配分组的内容。
于是我们的元字符就变成:reg = this is phone:(\d{11}) and this is my postcode:(\d{6})
我们一般使用search进行分组匹配,上次我是不是说过search需要使用列表取出来,这里的组匹配也是一样,不过这里用的是group()
方法。group(1)
代表了我们的手机号,group(2)
代表了我们的验证码,而group(0)
代表了我们的手机号和验证码,代码如下图所示。
在正则表达式中,除了findall和search用法,还有一个match用法。
match用法只匹配开头的,也是需要group()取出来,下图match的例子。
这是的re.I是忽略大小写的意思。
贪婪与非贪婪
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。
贪婪和非贪婪有几个非常重要的操作符。
操作符 | 含义 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
比如说这里边我有一个字符串reg_string = pythonnnnnnnnnpythonHelloPytho
,我们先使用贪婪的模式下的元字符:reg = "python*"
贪婪模式下的reg = "python*"
,意味着n重复零次或更多次。所以我们看到了第一关结果的pythonnnnnnnnn
尽可能多的匹配。
下面使用非贪婪的模式下的元字符:reg = "python*?"
,reg = "python+?"
,reg = "python??"
。
非贪婪模式下的
reg = "python*"
,意味着n
零次或一次,所以我们没有看到pythonnnnnnnnn
的结果。
手机号码验证
首先,我们要知道我们的手机号码是什么开头的?
移动手机号码开头有16个号段:134、135、136、137、138、139、147、150、151、152、157、158、159、182、187、188。
联通手机号码开头有7种号段:130、131、132、155、156、185、186。
电信手机号码开头有4个号段:133、153、180、189。
这样我们就可以在开头做事情了,先判断开头是不是上面的号段, regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$"
,就是我们的元字符,代码如下:
import re
def checkCellphone(cellphone):
regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$"
result = re.findall(regex,cellphone)
if result:
print("匹配成功")
return True
else:
print("匹配失败")
return False
cellphone = '13717378202'
checkCellphone(cellphone)
匹配成功
True
复制代码
匹配邮箱合法性
下面,我们进行一个作业,就是来匹配我们的邮箱号码。
作业的答案如下:
import re
def checkEmail(email):
regex_1 = '^(\w+)@sina.com$'
regex_2 = '^(\w+)@sina.com.cn$'
regex_3 = '^(\w+)@163.com$'
regex_4 = '^(\w+)@126.com$'
regex_5 = '^[1-9][0,9]{4,}+@qq.com$'
regex = [regex_1 ,regex_2 ,regex_3, regex_4, regex_5]
for i in regex:
result = re.findall(i,email)
if result:
print("匹配成功")
return True
else:
print("匹配失败")
return False
email = 'sdjflsdjkl@sina.com'
checkEmail(email)
复制代码
正则表达式测试工具
打开开源中国提供的正则表达式测试工具 tool.oschina.net/regex/,输入待匹…
例如,输入下面这段待匹配的文本:
Hello, my phone number is 123455678 and email is runsen@qq.com, and my website is https://blog.csdn.net/weixin_44510615.
复制代码
这段字符串中包含了一个电话号码和一个电子邮件,接下来就尝试用正则表达式提取出来,如图所示。
在网页右侧选择 “匹配 Email 地址”,就可以看到下方出现了文本中的 E-mail。如果选择 “匹配网址 URL”,就可以看到下方出现了文本中的 URL。是不是非常神奇?
深入Python中的正则表达式的更多相关文章
- Python::re 模块 -- 在Python中使用正则表达式
前言 这篇文章,并不是对正则表达式的介绍,而是对Python中如何结合re模块使用正则表达式的介绍.文章的侧重点是如何使用re模块在Python语言中使用正则表达式,对于Python表达式的语法和详细 ...
- 在Python中使用正则表达式同时匹配邮箱和电话并进行简单的分类
在Python使用正则表达式需要使用re(regular exprssion)模块,使用正则表达式的难点就在于如何写好p=re.compile(r' 正则表达式')的内容. 下面是在Python中使用 ...
- python模块 re模块与python中运用正则表达式的特点 模块知识详解
1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...
- Python学习-38.Python中的正则表达式(二)
在Python中,正则表达式还有较其他编程语言有特色的地方.那就是支持松散正则表达式了. 在某些情况,正则表达式会写得十分的长,这时候,维护就成问题了.而松散正则表达式就是解决这一问题的办法. 用上一 ...
- Python学习-37.Python中的正则表达式
作为一门现代语言,正则表达式是必不可缺的,在Python中,正则表达式位于re模块. import re 这里不说正则表达式怎样去匹配,例如\d代表数字,^代表开头(也代表非,例如^a-z则不匹配任何 ...
- [Python]网络爬虫(七):Python中的正则表达式教程
转自:http://blog.csdn.net/pleasecallmewhy/article/details/8929576#t4 接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一 ...
- [Python]网络爬虫(七):Python中的正则表达式教程(转)
接下来准备用糗百做一个爬虫的小例子. 但是在这之前,先详细的整理一下Python中的正则表达式的相关内容. 正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器. ...
- 在python中使用正则表达式(转载)
https://www.cnblogs.com/hanmk/p/9143514.html 在python中使用正则表达式(一) 在python中通过内置的re库来使用正则表达式,它提供了所有正则表 ...
- python中的正则表达式(re模块)
一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...
- python中关于正则表达式三
2015年8月14日 11:10 7.2正则表达式操作 正则表达式使用反斜杠字符'\'来暗示一些特殊的形式或者允许特殊的字符使用但是没有调用它们特殊的意思.在字符串常量中的相同目标的字符的python ...
随机推荐
- BUUCTF-[极客大挑战 2019]BabySQL 1 详解
打开靶机 应该是love sql惹的事吧,来了个加强版本的sql注入,不过我们先输入账号密码看有什么反应 整一手万能密码,闭合双引号?username=admin&password=admin ...
- Fiddler抓包工具 请求图标为一个锁的图标的设置
第一步,Fiddler抓包的数据 前面的都是一个锁的图标,的设置方法, 然后 点击打开 按此设置图一 在图二, 图三. 其他默认就好
- 网络IO模型-异步选择模型(Delphi版)
其实关于这个模型,网络上也有一个案例说明 老陈使用了微软公司的新式信箱.这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了, ...
- 解决SpringBoot 定时计划 quartz job 任务重复执行多次(10次)
上一篇:SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源 设置了多个 任务,本应该是各司其职的,任务调用多线程处理任务,but这个定时任务竟然同时跑了10次???如 ...
- 如何给LG gram写一个Linux下的驱动?
其实就是实现一下几个Fn键的功能,没有标题吹得那么牛. 不知道为啥,LG gram这本子意外的小众. 就因为这个,装Linux遇到的硬件问题就没法在网上直接搜到解决办法了. Fn + F9 实现阅读模 ...
- MeteoInfoLab脚本示例:计算水平螺旋度
尝试了用MeteoInfoLab编写计算水平螺旋度的脚本,结果未经验证.脚本程序: print 'Open data files...' f_uwnd = addfile('D:/Temp/nc/uw ...
- 【Azure 环境】连接到微软云Azure中国区 By VS 2019, VS Code, Powershell
问题情形 最近,在使用最新的VS Code插件连接到中国区的Azure时候,出现了依旧是global版的登录连接.这个问题是当前Azure Account插件最新版的问题,可以使用V0.8.11版本登 ...
- Jmeter入门(1)- 什么是Jmeter以及Jmeter的安装和环境配置
一. Jmeter简介 Jmeter时Apacha公司使用Java平台开发的一款测试工具 二. Jmeter可以做什么 Jmeter可以用来做接口测试.性能测试.压力测试.数据库测试.Java程序测试 ...
- BCE和CE交叉熵损失函数的区别
首先需要说明的是PyTorch里面的BCELoss和CrossEntropyLoss都是交叉熵,数学本质上是没有区别的,区别在于应用中的细节. BCE适用于0/1二分类,计算公式就是 " - ...
- kettle学习笔记(三)— 定时任务的脚本执行
kettle-定时任务 Kettle 的定时任务可以用kettle中的job工作来定时转换(缺点窗口不可关闭),同时也可以使用bat脚本来启动kettle的 '.ktr'转换. 注:这里对定时任务的时 ...