正则表达式re库 python3

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

import re

(一)函数

re.match函数

## re.match(pattern, string, flags=0)
# 匹配成功re.match方法返回一个匹配的对象,否则返回None。
# 我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。
参数:
pattern 匹配的正则表达式
string  要匹配的字符串。
flags   标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志# 不在起始位置开始匹配
a = re.match('www', 'www.baidu.cn')
print(a)  # <re.Match object; span=(0, 3), match='www'># 不在起始位置开始匹配
b = re.match('cn', 'www.baidu.cn')  # 会返回None
print(b)# 实例2
line = 'Cats are smarter than dogs'
matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)
print(matchObj)  # <re.Match object; span=(0, 26), match='Cats are smarter than dogs'>if matchObj:print("matchObj.group():", matchObj.group())  # matchObj.group(): Cats are smarter than dogsprint("matchObj.group(1):", matchObj.group(1))  # Catsprint("matchObj.group(2):", matchObj.group(2))  # smarter
else:print("No match!!")

re.search方法

## re.search(pattern, string, flags=0)
# 扫描整个字符串并返回第一个成功的匹配,没有返回None
# 我们可以使用group(num) 和groups() 匹配对象函数来获取匹配表达式# 在起始位置匹配
e = re.search('www', 'www.w3school.cn').span()  # (0,3)
print(e)# 不在起始位置匹配
f = re.search('cn', 'www.w3cschool.cn').span()  # (14,16)
print(f)# 实例2
line = "Cats are smater than dogs"searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)
# re.M多行匹配,影响 ^ 和 $ e.I忽略大小写
# r'(.*) are (.*?) .*'
# 首先,这是一个字符串,‘r’表示让编译器忽略反斜杠转义字符
# (.*) 第一个分组匹配, ',*'代表匹配从换行符之外的所有字符,贪婪
# (.*?) 第二个分组匹配,‘?’代表非贪婪,只匹配符合条件最少的字符
# 后面一个‘.*’没有括号,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。if searchObj:print(searchObj.group())  # Cats are smater than dogsprint(searchObj.group(1))  # Catsprint(searchObj.group(2))  # smater
else:print("nothing found!!")

re.match与re.search的区别

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.sub检索和替换

## 检索和替换 re.sub
# re.sub(pattern, repl, string, max=0) # 原始字符串在后面# 参数
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配phone = "2014-955-559 # 这是一个电话号码"
# 删除注释
num = re.sub(r'#.*$', '', phone)  # 2014-955-559
print(num)# 删除非数字内容
num = re.sub(r'\D', '', phone)  # 2014955559
print(num)# repl是一个参数
# 以下实例中将字符串中匹配的数字乘以2
print('repl 厉害用法')def double(matched):  # 注意这里的传参用法value = int(matched.group('value'))return str(value * 2)s = 'A23G4HFD567'
g = re.sub(r'(?P<value>\d+)', double, s)  # A46G8HFD1134 数字都乘以了2
print(g)

re.compile 函数

## re.compile函数
# re.compile(pattern[, flags])
# compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,、
# 供match()和search()这两个函数使用pattern = re.compile(r'\d+')  # 至少一个数字
m = pattern.match('one12twothree34four')  # 从头开始匹配 None
print(m)m = pattern.match('one12twothree34four', 3, 10)  # 从第四个位置开始皮配
print(m)  # <re.Match object; span=(3, 5), match='12'>
print(m.group())  # 12 字符串 注意:match出来的要用group取
print(m.start())  # 起始位置 3
print(m.end())  # 结束位置 5
print(m.span())  # 位置区间(3,5)

findall

## findall 返回列表或空列表
# 注意:match和search是匹配一次,findall是匹配所有
# findall(string[, pos[, endpos]])
pattern = re.compile(r'\d+')
result1 = pattern.findall('runoob 123 google 456')  # ['123', '456']
result2 = pattern.findall('run88oob123google456', 0, 10)  # ['88', '12']
print(result1)
print(result2)

re.finditer

## re.finditer
# 和findall类似,作为迭代器返回
# re.finditer(pattern, string, flags=0)
iter1 = re.finditer(r'\d+', "12a32bc43jf3")
for match in iter1:print(match.group())# 12# 32# 43# 3

re.split

## re.split 返回列表
# re.split(pattern, string[, maxsplit=0, flags=0])
参数  描述
pattern 匹配的正则表达式
string  要匹配的字符串。
maxsplit  分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。
flags   标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志aa = re.split('\W+', 'runoob。 runoob。 runoob.')  # ['runoob', 'runoob', 'runoob', '']
print(aa)bb = re.split('(\W+)', 'runoob, runoob, runoob.')  # ['runoob', ', ', 'runoob', ', ', 'runoob', '.', '']
print(bb)cc = re.split('\W+', 'runoob, runoob, runoob.', 1)  # ['runoob', 'runoob, runoob.']
print(cc)# 菜鸟上说:对于一个找不到匹配的字符串而言,split不会对其做出分割
# 但是: 事实是,全分割了
dd = re.split('a*', 'hello world')  # ['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']
print(dd)

补充:分组匹配’(?P<…>…)’

## '(?P<...>...)'分组匹配s = '1102231990xxxxxxxx'
res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{4})',s)
dict1 = res.groupdict()  # 以字典形式输出 {'province': '110', 'city': '223', 'born_year': '1990'}
print(dict1)

(二)正则表达式对象

# 正则表达式对象
# re.RegexObject  re.compile()返回RegexObject对象
# re.MatchObject  group()返回RE匹配的字符串
# start() 返回开始匹配的位置
# end() 返回匹配结束的位置
# span() 返回一个元组,包含匹配(开始,结束)的位置

(三)正则表达式修饰符-可选标志

re.I 使匹配对大小写不敏感。
re.M    多行匹配,影响^和$。
re.S    使.匹配包括换行在内的所有字符。re.L    做本地化识别(locale-aware)匹配。
re.U    根据Unicode字符集解析字符,影响\w,\W,\b,\B。
re.X    该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解。

(四)正则表达式模式

模式字符串使用特殊的语法来表示一个正则表达式:

字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

多数字母和数字前加一个反斜杠时会拥有不同的含义。

标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

反斜杠本身需要使用反斜杠转义。

由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r’\t’,等价于 ‘\t’)匹配相应的特殊字符。

下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

^    匹配字符串的开头。
$   匹配字符串的结尾。
.   匹配任意字符,除了换行符,re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。[...] 用来表示一组字符,如单独列出:[amk]匹配'a','m'或'k'。
[^...]  非[]的字符,如[^abc]匹配除了'a','b','c'以外的字符。...*    匹配0个或多个表达式。
...+   匹配1个或多个表达式。
...?    匹配0个或1个由前面正则表达式定义的片段,非贪婪方式。...{n}    精确匹配n个前面表达式,例如,o{2}不能匹配"Bob"中的"o",但能匹配"food"中的两个"o"。
...{n,} 匹配前面n个表达式,例如,"o{1,}"等价于"o+","o{0,}"等价于"o*",o{2}不能匹配"Bob"中的"o",但能匹配"foooood"中的所有"o"。
...{n,m}    匹配n到m次由前面的正则表达式定义的片段,贪婪方式。
a|b 匹配a或b(...)  匹配括号内的表达式,也表示一个组
(?imx)  正则表达式包含三种可选标志:i,m或x,只影响括号中的区域。
(?-imx) 正则表达式关闭i,m,x可选标志,只影响括号中的区域。(?:...)   类似(...),但是不表示一个组。
(?imx:...)  在括号中使用i,m或x的可选标志。
(?-imx:...) 在括号中不使用i,m或x的可选标志。(?#...)   注释。
(?= re)    前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)  匹配的独立模式,省去回溯。\w  匹配字母、数字、下划线。
\W  匹配非字母、数字、下划线。
\s  匹配任意空白字符,等价于[\t\n\r\f]。
\S  匹配任意非空字符。
\d  匹配任意数字,等价于[0-9]。
\D  匹配任意非数字\A   匹配字符串开始
\Z  匹配字符串结束,如果存在换行,只匹配到换行前的结束字符串。
\z  匹配字符串结束。
\G  匹配最后匹配完成的位置。\b  匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B  匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。\n,\t,等.   匹配一个换行符。匹配一个制表符。等。
\1...\9 匹配第n个分组的内容。
\10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。

(五)常用正则表达式

1.中文字符
[\u4e00-\u9fa5]说明:目前主流计算机底层的编码系统都是Unicode,而在Unicode标准中,汉字表的第一个编码为U+4e00,最后一个编码为U+9fa5,所以[\u4e00-\u9fa5]就代表匹配任意一个Unicode编码表中存在的汉字。
2.双字节字符
[^\x00-\xff]说明:\x代表十六进制形式,2个字节长度的十六进制最大范围为00-ff,所以[^\x00-\xff]表示匹配长度为双字节的字符。
3.空白行
\n\s*\r说明:这个表达式表示匹配内容中的空白行,比如一个txt由多行文字组成,并且句子与句子之间存在空白行,这个正则表达式便能加以区分。
首先,
\n表示匹配一个换行符,
而\s*代表匹配任意的空白符,
\r表示匹配任意的回车符。
4.Email地址
\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}或者:
[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?
示例:
wddpct@gmail.com,wdd.pct@gmail.com,wddpct-pct@gmail.com或者:
/^([0-9A-Za-z]+[-_\.]*[0-9A-Za-z]+)@([0-9A-Za-z]+\.[A-Za-z]{2,3}(\.[a-zA-Z]{2,3})?)$/
说明:由于不能以特殊符号开始或结束,所以[-_\.]*前后的表达式是"+",特殊符号的前后至少要有一个字符,邮箱的后缀由两部分或三部分组成,所以最后的(\.[a-zA-Z]{2,3})?是可选内容,这里的"?"表示范围0-1(即0次或1次)。
5.网页URL
^((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+或者
[a-zA-Z]+:\/\/[^\s]*说明:
[a-zA-Z]+表示匹配任意长度字符串,并且字符串包含的字符只能是a和z或者A和Z之间的字母。
‘:\/\/’表示匹配“://”字符串。
[^\s]*表示匹配任意长度的不包含非空字符的字符串。
6.手机(国内)
0?(13|14|15|18|17)[0-9]{9}
7.电话(国内)
\d{3}-\d{8}|\d{4}-\{7,8}说明:‘|’将匹配条件分为两部分。
\d{3}-\d{8}代表匹配xxx-xxxxxxxx数字形式的号码。
右边的\d{4}-\d{7,8}代表匹配xxxx-xxxxxxx或者xxxx-xxxxxxxx数字形式的号码。
8.腾讯QQ号
[1-9]([0-9]{4,10})
9.邮政编码
[1-9]\d{5}(?!\d)说明:
[1-9]表示匹配不为零的任意数字。
(?!)表示零宽断言的一种语法,又称零宽度负预测先行断言,表示位置的后面不能匹配表达式。
所以\d{5}(?!\d)表示匹配5位数字,而且这5位数字的后面不能是数字。
示例: 65900719951006773X
10.IP
(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)或者:
\d+\.\d+\.\d+\.\d+ (提取IP地址时有用)
11.身份证号
^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$说明:这段正则虽然很长,其实表达的意思也非常简单。
\d{6}代表匹配6位数字,
\d{4}代表匹配4位数字,
\d{2}代表匹配2位数字,
\d{3}代表匹配3位数字,
最后的[0-9]|X代表匹配0到9的任意数字,或者匹配X字母。或者
\d{17}[\d|x]|\d{15}
12.格式日期
\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}
13.匹配整数
-?[1-9]\d*
14.正整数
^[1-9]\d*$说明:
[1-9]表示首位匹配1到9的任意数字,
\d*代表从第二位开始可以为空,不为空时必须为数字。
15.负整数
^-[1-9]\d*$
16.匹配非负整数
^[1-9]\d*|0$说明:
非负整数包括0和正整数
17.正浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$说明:
[1-9]\d*\.\d*代表匹配格式形如“正整数.数字”的字符串,
中间用|代表或条件,
0\.\d*[1-9]\d*$ 代表匹配格式形如“0.数字”的字符串。
18.负浮点数
^-[1-9]\d*\.\d*|-0\.\d*[1-9]\d*$
19.用户名
[A-Za-z0-9_\-\u4e00-\u9fa5]+[A-Za-z0-9_\-\u4e00-\u9fa5]+或者:
2-14个英文或2-7个汉字(数字、下划线)
/^([\u4e00-\u9fa5\d_]{2,7})$|^([a-zA-Z0-9_]{2,14})$/

注:该文为整合笔记(菜鸟教程+w3cschool+csdn+简书)。

正则表达式re库 python3相关推荐

  1. php 匹配多个正则表达式,PHP 正则表达式函数库(两套)

    PHP 正则表达式函数库(两套) 更新时间:2009年10月14日 17:20:57   作者: 正则表达式:用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作 ...

  2. python怎么安装requests库-Python3.6安装及引入Requests库

    本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...

  3. python基础代码库-python3.4第三方库的安装?python基础代码库

    python怎么安装下载模块 python安装下载模块的:1.按盘上的[win r]快,打开运行窗口:2.输入cmd,点击定]:3.在打开的命令提示符中执行[pip install 模块名]命令即可. ...

  4. python怎么安装requests库-Python3.6安装及引入Requests库的实现方法

    本博客可能没有那么规范,环境之类的配置.只是让你直接开始编程写python. 至于各种配置网络上有多种方法. 本文仅代表我的观点的一种方法. 电脑环境:win10 64位 第一步:下载python. ...

  5. Re(正则表达式)库入门

    一.正则表达式的概念 正则表达式 "一行胜千言" regular expression regex RE 是用来简洁表达一组字符串的表达式. 'PN' 'PYN' 'PYTN' & ...

  6. 中正则表达式详解_python :正则表达式/re库 超级详细de注释解释

    首先要解释,什么是正则表达式: 给定一串字符串,我们可以提取他的特征,把他抽象成一个类型. 下次遇到和这个字符串同类的字符串,我们只需要判断是否符合特征,就知道这个字符串是不是同类的. 举个例子: 每 ...

  7. C/C++ 正则表达式 regex库介绍(详细版)

    文章目录 前言 一.总体观摩 1.纵观所有类 2.纵观所有函数 二.使用详解 1.使用前需要了解的东西 2.测试字符串 3.搜索子字符串 4.使用迭代器 5.替换字符串 6.分割字符串 7.异常处理 ...

  8. C++正则表达式regex库使用方法总结

    目录 一.regex库中常用组件介绍 二.regex库中常用组件使用 1.regex库组件使用准备 2.regex_match使用 3.regex_search使用 4.regex_replace使用 ...

  9. <学习笔记>从零开始自学Python-之-常用库篇(十一)正则表达式re库

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. re是Python的标准库,无需安装,直接导入使用. re 模块使 Python 语言拥有全部的正则表达式功能. 1 ...

最新文章

  1. MPB:北林张静等-丛枝菌根真菌(AMF)孢子、菌丝密度及侵染率定量测定方法
  2. 安装eclipse中html/jsp/xml editor插件以及改动html页面的字体
  3. 安装和使用Redis【转】
  4. lucene 搜索_使用Lucene的搜索服务器搜索Jira问题
  5. 真格量化-隐含波动率计算
  6. Exchange 2010 OWA 无法使用关键字搜索
  7. JAVA→JDBCJava DataBase Connectivity、存储过程Stored Procedure、事务Transaction、连接池DBCP C3P0、JDBC升级替代框架
  8. java实例摘要(三)
  9. [已解决]罗技鼠标驱动打不开问题
  10. VS2008(Visual Studio 2008)下载安装步骤
  11. 国际IT认证考试题库小程序
  12. ps4手柄驱动linux,Arduino和单片机区别,及Arduino入门教程
  13. 一分钟带你了解新版系统集成资质——信息系统建设和服务能力评估(CS)
  14. 谈一谈Restful接口设计风格
  15. ArcGIS server如何将自己的小地图叠加到Google maps或者Virtual Earth上
  16. 2、软件测试生命周期以及流程
  17. 比较好的android 手机号码,安卓手机最好的系统(五大公认最好用的安卓手机系统)...
  18. 【讲座笔记】商业分析全攻略手册
  19. 计算机科学如此博大精深,到底该怎么学?
  20. 虚拟主机cPanel面板查看服务器的访问日志

热门文章

  1. 控制图简明原理及Plotly实现控制图Python实践
  2. 佐治亚理工计算机科学录取,佐治亚理工大学计算机科学硕士申请条件及案例分享...
  3. 关于Arduino连接L298N供电问题
  4. ftp下载工具绿色版,网络上难找的绿色版ftp下载工具
  5. HTML使用无序列表制作一级菜单和二级下拉菜单
  6. 生产制造企业生产数据管理的四大原因
  7. ubuntu-16.04.6安装教程
  8. PHP串行化与JSON
  9. imple-unpack---攻防世界
  10. 纯前端导出export,复杂表格表头合并,表头数据部分动态,