7.17 正则表达式 re模块
在介绍正则表达式和re模块之前,先简要介绍一下
正则表达式与re模块的关系
1.正则表达式是一门独立的技术,任何语言均可使用
2.python中要想使用正则表达式需要通过re模块
正则表达式
元字符
##############################################


分组
##############################################

量词
##############################################

- {n}代表大括号前字符n个
- {n,m}代表大括号前字符n-m个
- {n,}代表大括号前字符n-多个
- {+,}代表大括号前字符1-多个
- {0,}代表大括号前字符0-多个
量词只能限制紧挨着他的那一个正则符号
注意:量词需要写在匹配符号的后面,并且只约束紧挨着它的那个正则表达式
转义符
在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对"\"进行转义,变成'\\'。
在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义。所以如果匹配一次"\n",字符串中要写成'\\n',那么正则里就要写成"\\\\n",这样就太麻烦了。这个时候我们就用到了r'\n'这个概念,此时的正则是r'\\n'就可以了。

对照表
|
语法 |
意义 |
说明 |
|
"." |
任意字符 |
|
|
"^" |
字符串开始 |
'^hello'匹配'helloworld'而不匹配'aaaahellobbb' |
|
"$" |
字符串结尾 |
与上同理 |
|
"*" |
0 个或多个字符(贪婪匹配) |
<*>匹配<\title>chinaunix</title> |
|
"+" |
1 个或多个字符(贪婪匹配) |
与上同理 |
|
"?" |
0 个或多个字符(贪婪匹配) |
与上同理 |
|
*?,+?,?? |
以上三个取第一个匹配结果(非贪婪匹配) |
<*>匹配<\title> |
|
{m,n} |
对于前一个字符重复m到n次,{m}亦可 |
a{6}匹配6个a、a{2,4}匹配2到4个a |
|
{m,n}? |
对于前一个字符重复m到n次,并取尽可能少 |
‘aaaaaa’中a{2,4}只会匹配2个 |
|
"\" |
特殊字符转义或者特殊序列 |
|
|
[] |
表示一个字符集 |
[0-9]、[a-z]、[A-Z]、[^0] |
|
"|" |
或 |
A|B,或运算 |
|
(...) |
匹配括号中任意表达式 |
|
|
(?#...) |
注释,可忽略 |
|
|
(?=...) |
Matches if ... matches next, but doesn't consume the string. |
'(?=test)' 在hellotest中匹配hello |
|
(?!...) |
Matches if ... doesn't match next. |
'(?!=test)' 若hello后面不为test,匹配hello |
|
(?<=...) |
Matches if preceded by ... (must be fixed length). |
'(?<=hello)test' 在hellotest中匹配test |
|
(?<!...) |
Matches if not preceded by ... (must be fixed length). |
'(?<!hello)test' 在hellotest中不匹配test |
贪婪匹配
正则匹配的时候默认都是贪婪匹配(尽量匹配多的)
<.*>:先拿着里面的\.\*去匹配所有的内容,然后再根据>往回退着找,遇到即停止
<.*?>:先拿着?后面的>去匹配符合条件的最少的内容,然后把匹配的结果返回
你可以通过在量词后面加一个?就可以将贪婪匹配变成惰性匹配
.*?x
就是取前面任意长度的字符,直到一个x出现
Re模块
三个必须掌握的方法
re.findall
# 第一个参数是正则表达式,第二个参数是待匹配的文本内容
ret = re.findall('a', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列表里
print(ret)
re.search
ret = re.search('a', 'eva egon yuan')
print(ret.group()) # 结果:'a'
# 函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,
该对象可以通过调用group()方法得到匹配的字符串,如果字符串没有匹配,则返回None,
并且需要注意的是如果ret是None,再调用.group()会直接报错。
这一易错点可以通过if判断来进行筛选
if ret:
print(ret.group())
re.match
ret = re.match('a', 'abc').group() # 同search,不过仅在字符串开始处进行匹配
print(ret) # ‘a'
# match是从头开始匹配,如果正则规则从头开始可以匹配上,
就返回一个对象,需要用group才能显示,如果没匹配上就返回None,调用group()就会报错
res = re.match('a','eva egon jason')
print(res)
print(res.group())
"""
注意:
1.match只会匹配字符串的开头部分
2.当字符串的开头不符合匹配规则的情况下 返回的也是None 调用group也会报错
"""
search 和match区别要弄清楚!!!!!!!!!!
match 和 search的区别,mathch从开头开始匹配找一个,search搜索所有找第一个
其他方法
re.split
ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
print(ret) # ['', '', 'cd'] 返回的还是列表
re.sub
ret = re.sub('\d', 'H', 'eva3bitten4yuan4',1) # 将数字替换成'H',参数1表示只替换1个
# sub('正则表达式','新的内容','待替换的字符串',n)
"""
先按照正则表达式查找所有符合该表达式的内容 统一替换成'新的内容' 还可以通过n来控制替换的个数
"""
print(ret) # eva3bitten4yuan4
re.subn
ret = re.subn('\d', 'H', 'eva3bitten4yuan4') # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
ret1 = re.subn('\d', 'H', 'eva3bitten4yuan4',1) # 将数字替换成'H',返回元组(替换的结果,替换了多少次)
print(ret) # 返回的是一个元组 元组的第二个元素代表的是替换的个数
re.compile
obj = re.compile('\d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
res1 = obj.findall('')
print(ret.group()) #结果 : 123
print(res1) #结果 : ['347', '982', '734', '729', '349', '827', '384']
re.finditer
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]) #查看剩余的左右结果
分组优先机制
对于search方法
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方法
ret = re.findall('www.(baidu|google).com', 'www.google.com')
print(ret) # ['google'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
ret = re.findall('www.(?:baidu|google).com', 'www.google.com') # ?:取消分组优先
print(ret) # ['www.google.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']
7.17 正则表达式 re模块的更多相关文章
- python正则表达式Re模块备忘录
title: python正则表达式Re模块备忘录 date: 2019/1/31 18:17:08 toc: true --- python正则表达式Re模块备忘录 备忘录 python中的数量词为 ...
- python 正则表达式re模块
#####################总结############## 优点: 灵活, 功能性强, 逻辑性强. 缺点: 上手难,旦上手, 会爱上这个东西 ...
- python基础之正则表达式 re模块
内容梗概: 1. 正则表达式 2. re模块的使⽤ 3. 一堆练习正则表达式是对字符串串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤.使用正则的优缺点: 优点: 灵活,功能性强, ...
- python记录_day23 正则表达式 re模块
一. 正则表达式 使用python的re模块之前应该对正则表达式有一定的了解 正则表达式是对字符串操作的一种逻辑公式.我们一般使用正则表达式对字符串进行匹配和过滤. 正则的优缺点: 优点:灵活, 功能 ...
- 十七. Python基础(17)--正则表达式
十七. Python基础(17)--正则表达式 1 ● 正则表达式 定义: Regular expressions are sets of symbols that you can use to cr ...
- Python面试题之Python正则表达式re模块
一.Python正则表达式re模块简介 正则表达式,是一门相对通用的语言.简单说就是:用一系列的规则语法,去匹配,查找,替换等操作字符串,以达到对应的目的:此套规则,就是所谓的正则表达式.各个语言都有 ...
- Python 正则表达式——re模块介绍
Python 正则表达式 re 模块使 Python 语言拥有全部的正则表达式功能,re模块常用方法: re.match函数 re.match从字符串的起始位置匹配,如果起始位置匹配不成功,则matc ...
- day15_7.17正则表达式与re模块
一.正则表达式 在用户登录注册,以及身份验证时,会发现,如果在手机号的窗口输入字母等不是手机号的格式的字符串时,会报错,这种筛选字符串的功能就是由正则表达式提供. 正则表达式是几乎所有编程语言都会设计 ...
- python正则表达式re模块详细介绍--转载
本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以是Unicode字符,这点不用担心,python会处理地和Ascii字符一样漂亮. 正则表达式使用反斜杆( ...
随机推荐
- python数据库-MongoDB的安装(53)
一.NoSQL介绍 1.什么是NoSQL NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL". NoSQL,指的是非关系型的数据库.NoSQL有时也称 ...
- php接口数据安全解决方案(二)
前言 实例演示token签名并创建token 解析token并校验token合法性 类库封装管理jwt实例 前言 JWT是什么 JWT是json web token缩写.它将用户信息加密到token里 ...
- Java底层技术系列文章-总揽
对于工作中经常用到的东西,还是多看看实现原理,这样用着才能放心. 源码思想学习计划: 1.java基础库 HashCode深入理解 java线程框架窥探 2.集合类 java枚举类使用 递归 ...
- SSAS 多维/表格设计模型--事实表与维表的关联
表格设计模型中,同多维设计模型相似, 维表和事实表相互独立,通过关系数据库中的外键来联系,互相关联构成一个统一的架构. DB中外键是需要唯一性约束的,即A表某列建立主键或者唯一键后,B表才可以引用为外 ...
- UVA663 Sorting Slides(烦人的幻灯片)
UVA663 Sorting Slides(烦人的幻灯片) 第一次做到这么玄学的题,在<信息学奥赛一本通>拓扑排序一章找到这个习题(却发现标程都是错的),结果用二分图匹配做了出来 蒟蒻感觉 ...
- 详解svm和smo的出现
SupportVector Machines are learning models used forclassification: which individuals in a population ...
- [小米OJ] 6. 交叉队列
思路: 大概思想如下: 1. 动态规划求解,构造dp[][] 二维数组: 2. 设dp[i][j], i 为 第一个字符串的第i个字母:j 为 第二个字符串的第j个字母 3. dp[i][j] 如果 ...
- 盘一盘 synchronized (一)—— 从打印Java对象头说起
Java对象头的组成 Java对象的对象头由 mark word 和 klass pointer 两部分组成, mark word存储了同步状态.标识.hashcode.GC状态等等. klass ...
- 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释
浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...
- ListActivity
ListActivity的使用 ListActivity类中集成了一个ListView控件. 通过继承ListActivity类可方便地使用ListView控件 1 public class 类名ex ...