Python学习(九) —— 正则表达式与re模块
一、正则表达式
定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式是匹配字符串内容的一种规则。在线测试工具: http://tool.chinaz.com/regex/
字符组:[],一个字符组匹配一个字符,[0-9],[A-Z],[a-z],[0-9A-Za-z]

量词 |
用法说明 |
| * | 重复零次或更多次 |
| + | 重复一次或更多次 |
| ? | 重复零次或一次 |
| {n} | 重复n次 |
| {n,} | 重复n次或更多次 |
| {n,m} | 重复n到m次 |
贪婪匹配:在满足匹配条件时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配,加上?,将贪婪匹配模式转为非贪婪匹配模式,会匹配尽量短的字符串
几个常用的非贪婪匹配:
*?:重复任意次,但尽可能少重复
+?:重复1次或更多次,但尽可能少重复
??:重复0次或1次,但尽可能少重复
{n,m}?:重复n到m次,但尽可能少重复
{n,}?:重复n次以上,但尽可能少重复
.*?x:取前面任意长度的字符,直到一个x出现
转义符:在正则表达式中,有很多有特殊意义的是元字符,例如\d和\s等,如果要在正则中匹配正常的‘\d’,则需要对'\'进行转义,变成'\\'。
^(\d{17}[\dx])|\d{15}
^\d{15}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
正则表达式匹配身份证号
2、re模块
导入:import re
re.findall():按照正则表达式找到所有符合的内容,返回列表
import re
ret = re.findall('a','alex egon barry')
print(ret) #'a','a'
re.finditer():按照正则表达式找到所有符合的内容,返回迭代器,通过调用group()方法得到匹配的字符串
import re
ret = re.finditer('\d','a1b2c3def')
for i in ret:
print(i.group())
#
#
#
re.search():按照正则表达式找到一个合适的就返回,没有返回None,通过调用group()方法得到匹配的字符串
import re
ret = re.search('[a-z]','32jfdsajg')
print(ret.group()) #j
re.match():按照正则表达式从开始进行匹配,匹配到一个返回,没有返回None,通过调用group()方法得到匹配的字符串
import re
ret = re.match('[a-z]{3}','how are you')
print(ret.group()) #how
re.sub(旧,新,字符串,次数):按照正则表达式进行替换,返回替换后的字符串,默认全部替换
import re
ret = re.sub('k','abc','like a kitty',1)
print(ret) #liabce a kitty
re.subn(旧,新,字符串):按照正则表达式进行替换,返回元组(替换后的字符串,替换次数)
import re
ret = re.subn('k','','like a kitty key')
print(ret) #('li8e a 8itty 8ey', 3)
re.split():按照正则表达式进行切割,返回一个列表
import re
ret = re.split('a','aalpha')
print(ret) #['','','lph','']
re.complie():编译,将正则表达式进行编译,提高运行效率
import re
obj = re.compile('\d{3}')
ret = obj.search('ab12cd345def')
print(ret.group()) #
注意:
1.findall的优先级查询:如果正则里面有括号,会优先匹配括号的内容并返回,如果想要匹配全部,用?:取消权限
import re
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']
2.split的优先级查询:如果正则里面有括号,会保留被切割的项,如果正则没有括号,不会保留被切割的项
import re
ret=re.split("\d+","eva3egon4yuan")
print(ret) #['eva', 'egon', 'yuan']
ret=re.split("(\d+)","eva3egon4yuan")
print(ret) #['eva', '3', 'egon', '4', 'yuan'] #没有()的没有保留所匹配的项,有()的保留了匹配的项,
#这个在某些需要保留匹配部分的使用过程是非常重要的
匹配标签
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> ret = re.search(r"<(\w+)>\w+</\1>","<h1>hello</h1>")
#如果不给组起名字,也可以用\序号来找到对应的组,表示要找的内容和前面的组内容一致
#获取的匹配结果可以直接用group(序号)拿到对应的值
print(ret.group(1)) #h1
print(ret.group()) #<h1>hello</h1>
匹配整数
import re
content = '1 - 2 * ( (60-30 +(-40/5.0) * (9-3.33 + 198/4*2998 +10 * 568/14 )))'
ret = re.findall(r'\d+\.\d+|(\d+)',content)
print(ret)
ret.remove('')
print(ret)
#['1', '2', '60', '30', '40', '', '9', '', '198', '4', '2998', '10', '568', '14']
#['1', '2', '60', '30', '40', '9', '', '198', '4', '2998', '10', '568', '14']
flags
re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用\w \W \s \S \d \D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释
Python学习(九) —— 正则表达式与re模块的更多相关文章
- Python学习系列(六)(模块)
Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...
- python学习第四十八天json模块与pickle模块差异
在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点 跨语言,体积小 缺点 只能支持 int st ...
- Python学习day17-常用的一些模块
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习之路13☞常用模块
一 time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type(t ...
- Python学习-第四节:常用模块-logging,re,time
1:logging模块 import logging logging.debug('This is debug message') logging.info('This is info message ...
- [Python学习笔记]正则表达式总结
常用缩写字符及其含义表格查询 缩写字符分类 含义 \d 0-9的任意数字 \D 除0-9的数字以外的任何字符 \w 任何字母.数字或下划线字符(可以认为是匹配"单词"字符) \W ...
- Python学习 之 正则表达式
1.简单的正则表达式 import re s=r'abc' re.findall(s,"aaaaaaaaaaaaaaa") #结果为[] re.findall(s,"ab ...
- Python学习—基础篇之常用模块
常用模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要 ...
- 【Python爬虫】正则表达式与re模块
正则表达式与re模块 阅读目录 在线正则表达式测试 常见匹配模式 re.match re.search re.findall re.compile 实战练习 在线正则表达式测试 http://tool ...
- python模块 re模块与python中运用正则表达式的特点 模块知识详解
1.re模块和基础方法 2.在python中使用正则表达式的特点和问题 3.使用正则表达式的技巧 4.简单爬虫例子 一.re模块 模块引入; import re 相关知识: 1.查找: (1)find ...
随机推荐
- Light Oj 1003
题意 : 给你m个二元关系, 问是否可以确定各个节点的先后关系: 思路: 拓扑排序, 判断是否有环: #include<bits/stdc++.h> using namespace std ...
- CodeVs 3150 (大数 + 递推)
#include<iostream> #include<cstdio> #include<cstring> #include<string> #incl ...
- 【原创】Linux基础之命令行浏览器links
有时服务器环境受限,比如在内网环境不能暴露端口从外网访问,用curl看html代码比较累,这时可以使用命令行浏览器来查看相关页面 links 官方:http://links.twibright.com ...
- sql 迈安
SELECT b.* FROM dbo.[耕地肥料_01土壤肥料机构建设基本情况]as b ,bs_org where--县(b.任务id in((select bs_task.id--,bs_org ...
- 谷歌被爆秘密研发新系统 欲5年内取代Android
谷歌2年多来有一群工程师秘密研发新系统,希望最终能取代手机操作系统安卓.安卓日前遭欧盟以反垄断为由重罚. 谷歌的新研发计划Fuchsia是从零开始,希望在更多个人装置和各式小巧装置联机上网的情况下,能 ...
- java基础编程题练习(一)
1.编程实现用户输入4个整数,按从大到小的顺序排列输出. 思路:将输入的数据存入数组,使用冒泡排序对数组数据进行排序后输出数组 冒泡排序的代码如下: import java.util.Scanner; ...
- spring jdbctemplate调用存储过程,返回list对象
注:本文来源于< spring jdbctemplate调用存储过程,返回list对象 > spring jdbctemplate调用存储过程,返回list对象 方法: /** * 调用 ...
- 使用应用链接来连接 Jira 和 Confluence 6
请参考 Linking to Another Application 页面中的内容来设置如何让 Confluence 连接到你的 Jira 应用,这个过程只需要一次就可以了. 如果你计划使用 Jira ...
- Confluence 6 用户宏示例 - NoPrint
这个示例演示了如何创建一个用户宏,这个宏包括了在查看页面中显示的内容,但是不被打印. Macro name noprint Visibility Visible to all users in the ...
- Swift中 @objc 使用介绍
在swift 中 如果一个按钮添加点击方法 如果定义为Private 或者 定义为 FilePrivate 那么会在Addtaget方法中找不到私有方法 但是又不想把方法暴露出来,避免外界访问 ,那 ...