py正则与re模块
正则表达式符号介绍
按照博客中的表格罗列的去记即可
了解
\w,\s,\d与\W,\S,\D相反的匹配关系(对应的两者结合就是匹配全局)
\t匹配制表符
\b匹配结尾的指定单词
优先掌握
^:以什么什么开头
^[a-z]
^[0-9]
$:以什么什么结尾
ps:^与$连用能够精准匹配固定长度的目标字符,^只能出现在开头(),$只能出现结尾
|:或
ab|abc优先匹配前面的正则表达式ab,匹配上就不再用后面的abc,可以通过调换顺序修改优先级
^:出现在[]中的^表示除了^后面的其他都匹配
[^a]除了a其他都匹配
[^a-z]除了小写字母a-z其他都匹配
上面的是匹配单个字符的符号,接下来需要学习匹配个数的限制符号
量词
+:我想要匹配13838384388,\d一次只能匹配到一个数字,要想一次讲号码全部匹配上需要用到\d+,+表示重复一次或者多次,并且正则中默认都是贪婪匹配,越多越好
*:匹配0次或多次
?:匹配0次或一次
ps:
1.对于这个0次也能匹配出来的结果,暂时不用考虑
2.*,+,?的工作区间可以用坐标轴的形式表示出来
{n}:明确指定个数
注意:量词需要写在匹配符号的后面,并且只约束紧挨着它的那个正则表达式
小例子
逐个匹配出后面的道:轨道 通道 地道 魔道 人道
匹配人名:海燕海娇海东
字符集
分组
一次性匹配a1b2c3
用[a-z][0-9]会匹配到三个结果
想法:重复写三次,但是太麻烦,加量词的话只能限制离得最近的正则表达式
这个时候就可以用分组([a-z][0-9])+
匹配身份证号
依据博客一次分析(下面的正则之所以加^和$是因为我们仅仅只想匹配身份证号,教学演示方便,不加照样也能匹配上,只不过前后可以出现很多其他字符)
1.^[1-9]\d{13,16}[0-9x]$:不完善的地方在于默认是x的情况只在18位才可能出现,但是这个表达式没有做这一层的限制
2.^[1-9]\d{14}(\d{2}[0-9x])?$
3.^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
转义符
在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对""进行转义,变成'\'。
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。
所以如果匹配一次"\n",字符串中要写成'\\n'
所以如果匹配一次"\\n",字符串中要写成'\\\\n'
简便操作,利用r可以让整个字符串都不再转义(了解:r其实就是real的意思,真实不转义)
贪婪匹配与非贪婪匹配
<.*>:先拿着里面的.*去匹配所有的内容,然后再根据>往回退着找,遇到即停止
<.*?>:先拿着?后面的>去匹配符合条件的最少的内容,然后把匹配的结果返回
ps:根据匹配的内部原理可以很好的理解
.*?x
就是取前面任意长度的字符,直到一个x出现
至此整个后期项目里面能用到的正则表达式就已经给你讲完了,把这些记住足够你在后面的项目和爬虫中用了
讲了这么久,一点python的事儿都还没扯,现在就要来学在python里面如何使用
re模块使用
三个必须掌握的方法
findall
search
match
import re
# 第一个参数是正则表达式,第二个参数是待匹配的文本内容
ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列表里
print(ret)
ret = re.search('a', 'eva egon yuan')
print(ret.group()) # 结果:'a'
# 函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None,并且需要注意的是如果ret是None,再调用.group()会直接报错。这一易错点可以通过if判断来进行筛选
if ret:
print(ret.group())
ret = re.match('a', 'abc').group() # 同search,不过仅在字符串开始处进行匹配
print(ret) # ‘a'
# match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个对象,需要用group才能显示,如果没匹配上就返回None,调用group()就会报错
其他方法
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret) # ['', '', 'cd']
ret = re.sub('\d', 'H', 'eva3egon4yuan4', 1) # 将数字替换成'H',参数1表示只替换1个
print(ret) # evaHegon4yuan4
ret = re.subn('\d', 'H', 'eva3egon4yuan4') # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret)
obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
print(ret.group()) #结果 : 123
import re
ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
print(ret) # <callable_iterator object at 0x10195f940>
print(next(ret).group()) #查看第一个结果
print(next(ret).group()) #查看第二个结果
print([i.group() for i in ret]) #查看剩余的左右结果
扩展
分组优先机制
import re
res = re.search('^[1-9]\d{14}(\d{2}[0-9x])?$',110105199812067023)
print(res.group())
print(res.group(1)) # 获取正则表达式括号阔起来分组的内容
print(res.group(2)) # search与match均支持获取分组内容的操作 跟正则无关是python机制
# 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果
ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # ?:取消分组优先
print(ret) # ['www.oldboy.com']
补充
import re
ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>")
#还可以在分组中利用?<name>的形式给分组起名字
#获取的匹配结果可以直接用group('名字')拿到对应的值
print(ret.group('tag_name')) #结果 :h1
print(ret.group()) #结果 :<h1>hello</h1>
"""
注意?P=tag_name相当于引用之前正则表达式,并且匹配到的值必须和前面的正则表达式一模一样
"""
# 匹配整数
ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
ret=re.findall(r"\d+\.\d*|(\d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) #['1', '2', '60', '', '5', '4', '3']
ret.remove("")
print(ret) #['1', '2', '60', '5', '4', '3']
py正则与re模块的更多相关文章
- day 18 - 1 正则与 re 模块
正则表达式 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个 “规则字符串”,这个 “规则字符串” 用来表达对字符串的一种过滤逻辑. 我 ...
- Jupyter notebook导入Pycharm项目的.py文件里的模块及方法
Jupyter notebook导入Pycharm项目种的.py文件里的模块及方法 需要在Jupyter notebook里调用自己写的代码,过程如下. 首先在Pycharm里写好一个文件,例如DCC ...
- python正则以及collections模块
正则 一.认识模块 什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是加上.py的后缀,但其实import加载的模块分为四个通用类别 : 1.使用python编写的代码(.p ...
- python 基础之第十二天(re正则,socket模块)
In [14]: 'hello-wold.tar.gz'.split('.') Out[14]: ['hello-wold', 'tar', 'gz'] In [15]: import re In [ ...
- 【py网页】urllib模块,urlopen
Python urllib 库提供了一个从指定的 URL 地址获取网页数据,然后对其进行分析处理,获取想要的数据. 下面是在 Python Shell 里的 urllib 的使用情况: 01 Pyth ...
- Python 正则处理_re模块
正则表达式 动机 文本处理成为计算机常见工作之一 对文本内容搜索,定位,提取是逻辑比较复杂的工作 为了快速方便的解决上述问题,产生了正则表达式技术 定义 文本的高级匹配模式, 提供搜索, 替换, 本质 ...
- pycharm导入本地py文件时,模块下方出现红色波浪线时如何解决
有时候导入本地模块或者py文件时,下方会出现红色的波浪线,但不影响程序的正常运行,但是在查看源函数文件时,会出现问题 问题如下: 解决方案: 1. 进入设置,找到Console下的Python Co ...
- day19 正则,re模块
http://www.cnblogs.com/Eva-J/articles/7228075.html 所有常用模块的用法 正则的规则: 在一个字符组里面枚举合法的所有字符,字符组里面的任意一个字符和 ...
- python 带正则的search 模块
glob 是python 提供的一个支持正则表达式的查找文件的模块. 实现上采用了os.listdir() 和 fnmatch.fnmatch(). 但是没有真的invoking a subshe ...
- day23 正则,re模块
一. 简谈正则表达式 元字符 . 除了换行符外任意字符. \w 数字.字母.下划线 \s 空白符 \b 单词的末尾 \d 数字 \n 匹配换行符 \t 匹配制表符 \W 除了数字. 字母 下划线 \D ...
随机推荐
- Apache Hudi 负载类Payload使用案例剖析
在 Hudi 中可以根据业务场景为 Hudi 表配置负载类Payload,它用于在更新期间合并同一记录的两个版本.本文将深入了解有效负载类的用途以及可以使用的所有不同方式. 配置:hoodie.dat ...
- pytorch学习笔记一之张量
1. 张量¶ 1.1. 概述¶ 张量(tensor)是pytorch中的一种较为基础的数据结构,类比于numpy中的ndarrays,在pytorch中,张量可以在GPU中进行运算 通 ...
- java环境变量(Windows 11)
1.下载JDK,之后安装 建议安装java8或者java11,稳定,大家都在用 下载网址:https://www.oracle.com/java/technologies/downloads/#jav ...
- err has no member, has initializer but incomplete type
原因:没有头文件
- 疑问:如何替代dtb文件
学习设备树,想添加自己定义的节点,编译好了,但不知道如何替代原来的dtb文件
- 一台电脑连接多个不同IP段
1.首先让电脑能联网,则在ipv4里面设置好能上网的ip地址,dns则为路由器ip 备用dns8.8.8.8 2.点击高级依次添加其他内网ip段 例如192.168.0.66 ----------19 ...
- ROS1 Qt5 CMake基本配置
############################################################################## # CMake ############# ...
- antdVue 重置select和input的样式 去掉蓝色换成灰色
代码实现: <template> <div> <a-select mode="tags" style="width: 200px" ...
- 狂神--Docker
官网地址 官网 https://www.docker.com/ 官方文档Docker文档是超详细的 https://docs.docker.com/ 仓库地址 https://hub.docker.c ...
- 安全测试-WEB安全渗透测试基础知识(五)
1.5. 代码审计 1.5.1. 简介 代码审计是找到应用缺陷的过程.其通常有白盒.黑盒.灰盒等方式.白盒指通过对源代码的分析找到应用缺陷,黑盒通常不涉及到源代码,多使用模糊测试的方式,而灰盒则是黑白 ...