python3.x 正则表达式的应用
正则表达式是我认为比较难的一个东西,今天忽然又学到了这个,想到写下来,以后作为参考手册使用。
python如果想使用python需要引用re方法,在文件开始进行引用。
import re
接下来说一下re包含的函数的用法。
re.__all__
返回一个包含re函数名的列表
print(re.__all__)
结果如下:
['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']
re.__version__
返回re的版本
print(re.__version__)
结果如下:
2.2.1
match(pattern, string, flags=0)
判断pattern是否在string开始位置,如果有,返回匹配的对象,否则返回None
(为了演示方便以及照顾不是特别了解正则表达式的童鞋,这里使用简单的字符串匹配来观察效果,具体的正则表达式写法下章会说明。flags是一个标志变量,文章最后会进行说明,默认为0,没有效果,其他的方法相同。)
能匹配上时:
source='qq14717287xx@qq.com'
item='qq1'
res=re.match(item,source)
if res:
print(res)
print(res.group())
else:
print(res)
print('No match!')
结果如下:
<_sre.SRE_Match object; span=(0, 3), match='qq1'>
qq1
可以看到,如果只是打印es会输出匹配项,匹配多长字符,匹配的字符。
匹配之后res有group方法,能够输出匹配了哪些字符。
不能匹配上时:
source='qq14717287xx@qq.com'
item='qq2'
res=re.match(item,source)
if res:
print(res)
print(res.group())
else:
print(res)
print('No match!')
结果如下:
None
No match!
没有匹配上的时候res没有group方法,如果使用的话会报错。
fullmatch(pattern, string, flags=0)
判断pattern是否是string的全部,如果是,返回匹配的对象,否则返回None
能匹配上时:
source='qq14717287xx@qq.com'
item='qq14717287xx@qq.com'
res=re.fullmatch(item,source)
if res:
print(res)
print(res.group())
else:
print(res)
print('No match!')
结果如下:
<_sre.SRE_Match object; span=(0, 19), match='qq14717287xx@qq.com'>
qq14717287xx@qq.com
不能匹配上时:
source='qq14717287xx@qq.com'
item='qq14717287'
res=re.fullmatch(item,source)
if res:
print(res)
print(res.group())
else:
print(res)
print('No match!')
结果如下:
None
No match!
不是全部的字符串就不能匹配上,同样的,没有匹配上就没有group方法。
search(pattern, string, flags=0)
判断string里面是否包含pattern,如果有,返回匹配的对象,否则返回None
能匹配上时:
source='qq14717287xx@qq.com'
item='xx'
res=re.search(item,source)
if res:
print(res)
print(res.group())
else:
print(res)
print('No match!')
结果如下:
<_sre.SRE_Match object; span=(10, 12), match='xx'>
xx
不能匹配上时:
source='qq14717287xx@qq.com'
item='xz'
res=re.search(item,source)
if res:
print(res)
print(res.group())
else:
print(res)
print('No match!')
结果如下:
None
No match!
与match函数相同,如果不能匹配上时就没有group方法,否则会报错。
sub(pattern, repl, string, count=0, flags=0)
判断string里面是否含有pattern,如果含有则使用repl替换,返回新字符串。不改变原有字符串。count定义替换的次数,如果不填写默认替换字符串中全部匹配的项。
能匹配上时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.sub(item,'n',source,4)
print(res)
print(source)
结果如下:
qqn47n7287xx@qq.com&n00n0/10086
qq14717287xx@qq.com&10010/10086
可以看出,原字符串中的‘1’被替换成了‘n’四次,同时没有改变源字符串。
不能匹配上时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.sub(item,'n',source,4)
print(res)
print(source)
结果如下:
qq14717287xx@qq.com&10010/10086
qq14717287xx@qq.com&10010/10086
由结果可以看出,此函数如果没有匹配上也不会报错。
subn(pattern, repl, string, count=0, flags=0)
同sub函数,但是返回一个元组,包含修改后的字符串以及修改的次数。
能匹配上时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.subn(item,'n',source,4)
print(res)
print(source)
结果如下:
('qqn47n7287xx@qq.com&n00n0/10086', 4)
qq14717287xx@qq.com&10010/10086
可以看到,函数返回了一个数组,包括新字符串以及修改的次数。函数并没有修改原字符串。
不能匹配上时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.subn(item,'n',source,4)
print(res)
print(source)
结果如下:
('qq14717287xx@qq.com&10010/10086', 0)
qq14717287xx@qq.com&10010/10086
可以看到,函数返回的修改次数为0
split(pattern, string, maxsplit=0, flags=0)
以pattern作为分隔符给string进行分隔,返回一个列表。maxsplit定义最多分几次,不写默认全部进行分隔。
能够匹配上时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.split(item,source,4)
print(res)
print(source)
结果如下:
['qq', '', '7287xx@qq.com&', '', '0/10086']
qq14717287xx@qq.com&10010/10086
以‘1’作为分隔符分了四次,可以看到,并没有改变原字符串。
不能匹配时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.split(item,source,4)
print(res)
print(source)
结果如下:
['qq14717287xx@qq.com&10010/10086']
qq14717287xx@qq.com&10010/10086
可以看到,此函数没有匹配上也不会报错。
findall(pattern, string, flags=0)
查找string中全部匹配pattern的项,返回一个列表
能够匹配时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.findall(item,source)
print(res)
print(source)
结果如下:
['', '']
qq14717287xx@qq.com&10010/10086
不能匹配时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.findall(item,source)
print(res)
print(source)
结果如下:
[]
qq14717287xx@qq.com&10010/10086
finditer(pattern, string, flags=0)
效果与findall相似,只不过finditer返回一个迭代器,拥有group方法(匹配的字符串)和span方法(匹配字符串的位置)
能够匹配时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.finditer(item,source)
for i in res:
print(i.group(),i.span())
print(res)
print(source)
结果如下:
100 (20, 23)
100 (26, 29)
<callable_iterator object at 0x0111B4F0>
qq14717287xx@qq.com&10010/10086
遍历迭代器使用group方法和span方法可以得到匹配的字符和字符匹配的位置。
不能匹配时:
source='qq14717287xx@qq.com&10010/10086'
item=''
res=re.finditer(item,source)
for i in res:
print(i.group(),i.span())
print(res)
print(source)
结果如下:
<callable_iterator object at 0x018FB4F0>
qq14717287xx@qq.com&10010/10086
可以看到,如果不匹配的话,迭代器就没有输出
compile(pattern, flags=0)
预编译正则表达式。以上的方法都是在进行调用的时候开始编译正则表达式,如果查找条目较多,比如说5亿个数据,每次都编译的话,效率必然会受到影响。而使用compile函数则可以预编译正则表达式,这样就不必每次都编译正则表达式,提高效率。
用法:
source='qq14717287xx@qq.com&10010/10086'
res=re.compile('')
print(res.findall(source))
print(source)
结果如下:
['', '']
qq14717287xx@qq.com&10010/10086
purge()
清除缓存中的正则表达式。这个,没有明白具体用法。
template(pattern, flags=0)
编译一个模版表达式,返回一个表达式对象。没有明白用法。
escape(pattern)
对字符串中的非字母数字进行转义,将字符串转义为python能够识别的正则表达式。
用法:
source='qq14717287xx@qq.com&10010/10086'
print(re.escape(source))
结果如下:
qq14717287xx\@qq\.com\&10010\/10086
编译标志位解释:
编译标志位就是函数后面的flags参数,通过设置能够改变正则表达式匹配规则,具有更大的灵活性。多个标志位可以通过按位OR进行设定,如I|M被设置为I标志和M标志。
A ASCII 字符串模式中匹配ASCII字符类,而且是默认模式。字节模式中则是唯一可以使用的模式,不需要进行指定。
I IGNORECASE 匹配时忽略大小写的变化。
L LOCALE 影响 \w, \W, \b和\B,取决于当前的本地化设置。
locales 是 C 语言库中的一项功能,是用来为需要考虑不同语言的编程提供帮助的。举个例子,如果你正在处理法文文本,你想用 "w+ 来匹配文字,但 "w 只匹配字符类 [A-Za-z];它并不能匹配 "é" 或 "?"。如果你的系统配置适当且本地化设置为法语,那么内部的 C 函数将告诉程序 "é" 也应该被认为是一个字母。当在编译正则表达式时使用 LOCALE 标志会得到用这些 C 函数来处理 "w 後的编译对象;这会更慢,但也会象你希望的那样可以用 "w+ 来匹配法文文本。
M MULTILINE “^”只匹配每一行的开头,如果之前有换行符,则不考虑换行符之前的内容,“$”只匹配每一行的结尾,如果之后有换行符,不考虑换行符之后的内容。
S DOTALL 使 "." 完全匹配任何字符,包括换行;如果没有这个标志, "."只会匹配除了换行外的任何字符。
X VERBOSE 允许将正则表达式写为多行,忽略空白字符(字符类或者反斜杠之后的不忽略)。可以添加注释,注释使用“#”号标识(不能在字符串或者反斜杠之后)。
U UNICODE 仅用于兼容性。忽略字符串模式(默认),并禁止字节模式。
用法如下(以I为例,其它标志位用法相同):
source='QQ14717287xx@qq.com&10010/10086'
item='qq14717287xx@QQ'
res=re.findall(item,source,re.I)
print(res)
print(source)
运行结果是:
['QQ14717287xx@qq']
QQ14717287xx@qq.com&10010/10086
python3.x 正则表达式的应用的更多相关文章
- python3.5 正则表达式
我们平时上网的时候,经常需要在一些网站上注册帐号,而注册帐号的时候对帐号名称会有一些要求. 比如: 上面的图片中,输入的邮件地址.密码.手机号 才可以注册成功. 我们需要匹配用户输入的内容,判断用户输 ...
- python3的正则表达式(regex)
正则表达式提供了一种紧凑的表示法,可用于表示字符串的组合,一个单独的正则表达式可以表示无限数量的字符串.常用的5种用途:分析.搜索.搜索与替代.字符串的分割.验证. (一)正则表达式语言python中 ...
- python3之正则表达式
1.正则表达式基础 正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不然str自带方法,但功能十分强大. 正则表达式的大致匹配流程:依次拿出表达式和文本中的字 ...
- Python3之正则表达式详解
正则表达式 本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在话下. 当然对于爬虫来说,有了它,我们从HTM ...
- Python3(七) 正则表达式与JSON
一. 初识正则表达式 1.定义:是一个特殊的字符序列,可以帮助检测一个字符串是否与我们所设定的字符序列相匹配. 2.作用:可以实现快速检索文本.实现替换文本的操作. 3.场景: 1.检测一串数字是否是 ...
- 自己动手实现html去标签和文本提取
随意观看 [TOC] 工具 python3.6 正则表达式(别的语言思路一样,容易借鉴) python正则表达式:flags的应用 这里主要介绍一下re.compile(pattern[, flags ...
- 537. Complex Number Multiplication
题目大意: 给出a, b两个用字符串表示的虚数,求a*b 题目思路: 偷了个懒,Python3的正则表达式匹配了一下,当然acm里肯定是不行的 class Solution: def complexN ...
- Python爱好者社区历史文章列表(每周append更新一次)
2月22日更新: 0.Python从零开始系列连载: Python从零开始系列连载(1)——安装环境 Python从零开始系列连载(2)——jupyter的常用操作 Python从零开始系列连载( ...
- Python3 如何优雅地使用正则表达式(详解一)
注:本文翻译自 Regular Expression HOWTO,小甲鱼童鞋对此做了一些注释和修改. 正则表达式介绍 正则表达式(Regular expressions 也称为 REs,或 regex ...
随机推荐
- 据说excel流是这么做,上次我分享的是csv格式。这个是excel格式。
import xlwt import StringIO import web urls = ( '/rim_request','rim_request', '/rim_export','rim_exp ...
- SpringWeb项目常用注解简单介绍
注解分为两类: 一类是使用Bean,即是把已经在xml文件中配置好的Bean拿来用,完成属性.方法的组装:比如@Autowired , @Resource,可以通过byTYPE(@Autowired) ...
- TCP/IP协议 计算机间的通讯,传输、socket 传输通道
#! /usr/bin/env python3 # -*- coding:utf-8 -*- #TCP/IP简介 #为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现 ...
- minifilter
暑假刚开始的时候,参照<寒江独钓>这本书,用VS2015写过的一个minifilter的框架,今天在博客上分享出来. VS2015已经有了minifilter的框架模板,直接生成了mini ...
- Linux文件系统命令 umask
命令:umask 功能:指定创建文件或者文件夹的时,默认的权限设置 用法:umask -S:以rwx的方式查看创建文件的权限 umask -p:以补位的方式查看文件的权限,显示的是补位的十进制. 另外 ...
- MVC实现上传图片的方法
Form提交时,须注意form需要添加属性enctype="multipart/form-data",否则Request.Files.Count=0,无法上传图片. cshtml代 ...
- L309 单音节词读音规则(一)-辅音字母发音规则
1 字母和音素不是一一对应的 2单词读音规则知识结构全图 二 15个发音不变化的辅音字母:字母发音和音素一致 b / b / by d / d / dog f / f / fish h ...
- SQL server 存储过程学习
一.定义变量--简单赋值 declare @a intset @a=5 print @a --使用select语句赋值 declare @user1 nvarchar(50) select @user ...
- SQL注入之Sqli-labs系列第十九关(基于头部的Referer POST报错注入)
开始挑战第十八关(Header Injection- Referer- Error Based- string) 先来说下HTTP Referer: HTTP Referer是header的一部分,当 ...
- Linux命令--1
之前一直在学习Linux,不过有点一天打鱼两天晒网的意味,现在希望通过写博客的形式,积累更多的知识,也希望可以帮到同在linux坑中的各位小伙伴们~ PS:我的笔记重点在于通俗,很多命令一百度就有,但 ...