1、基础知识

正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎

正则表达式的大致匹配流程:依次拿出表达式和文本中的字符比较,

如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。

常用的表达式规则
'.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
'^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
'$' 匹配字符结尾, 若指定flags MULTILINE ,re.search('foo.$','foo1\nfoo2\n',re.MULTILINE).group() 会匹配到foo1
'*' 匹配*号前的字符0次或多次, re.search('a*','aaaabac') 结果'aaaa'
'+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
'?' 匹配前一个字符1次或0次 ,re.search('b?','alex').group() 匹配b 0次
'{m}' 匹配前一个字符m次 ,re.search('b{3}','alexbbbs').group() 匹配到'bbb'
'{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
'|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
'(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45' '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
'\Z' 匹配字符结尾,同$
'\d' 匹配数字0-9
'\D' 匹配非数字
'\w' 匹配[A-Za-z0-9]
'\W' 匹配非[A-Za-z0-9]
's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t' '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","
re的匹配语法有以下几种
re.match 从头开始匹配
re.search 匹配包含
re.findall 把所有匹配到的字符放到以列表中的元素返回
re.split 以匹配到的字符当做列表分隔符
re.sub 匹配字符并替换
re.fullmatch 全部匹配

2、re方法:

2.1、re.match

从开头位置匹配,匹配成功只返回一个,返回的是对象
若要显示值。group() 返回被 RE 匹配的字符串 re.match语法:re.match(pattern,string,flags=0) pattern:匹配的正则表达式,string:要匹配的字符串,flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等。
s = 'abc1d3e'
print(re.match('[a-z]',s).group())
print(re.match('[0-9]',s)) >a
>None

2.2、re.search(pattern,string ,flags=0)

re.search(pattern, string, flags=0)

用于查找字符串中可以匹配成功的子串,从string的开始位置匹配到结尾,匹配成功则返回一个匹配结果不再向后匹配了,如匹配失败则返回None。
pattern = re.search('w','aw,bw,cw,dw')  #匹配结果
print(pattern) #返回一个match对象
print(pattern.group()) #获取一个分组截获的字符串
print(pattern.start()) #截获字符串的开始索引
print(pattern.end()) #截获字符串的结束索引
>w
>1
>2
  • group() 返回被 RE 匹配的字符串
  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置

2.3、re.findall(pattern,string,flags=0)

re.findall(pattern, string, flags=0)

搜索string,以列表的形式返回全部能匹配到的字串。

s = 'abc1d3e'
print(re.findall('[a-z]',s)) print(re.findall('[0-9]','a1b2c3')) print(re.findall('\d+','a21b32c35'))
#以列表的形式返回所有匹配的子串,\d+为匹配1到多个数字 输出结果:
['a', 'b', 'c', 'd', 'e']
['', '', '']
['', '', '']

2.4、re.finditer(patter,string,flag=0)

re.finditer(pattern, string, flags=0)

搜索string,返回访问每一个匹配结果的match对象的迭代器

pat = re.finditer('\d+','aa123bb456cc')  #返回match对象的一个迭代器
print(pat) for i in pat: #循环迭代器取值
print(i.group()) >
<callable_iterator object at 0x0000000002696A90>
123
456

2.5、re.sub()

re.sub(pattern, repl, string, count=0, flags=0)

使用repl替换string中每一个匹配的子串后返回替换后的字符串。count用于指定最多替换的次数,默认时时全部替换。

pat = re.sub('\d+','@@@','aaa1bbb22ccc333')
print(pat) #替换匹配对象
print(re.sub('\d+','@@@','aaa1bbb22ccc333',count=2)) >
aaa@@@bbb@@@ccc@@@
aaa@@@bbb@@@ccc333
有加号时 把1 22 333 看成一个整体
没有就会单个,,,每个都会替换 aaa@@@bbb@@@@@@ccc@@@@@@@@@
'\d'没有+,结果不一样

2.6、re.compile()

re.compile(pattern,flags=0)

编译一个正则表达式模式,返回一个模式对象

import re
re1 = re.compile(r'hello') #编译一个正则匹配模式
print(type(re1))
print(re.match(re1,'hello world').group()) >
<class 're.Pattern'>
hello

2.7、re.spilt()

re.spilt

re.split(pattern, string[, maxsplit])
按照能够匹配的子串将string分割后返回列表。 maxsplit用于指定最大分割次数,不指定将全部分割。 import re s='9-2*5/3+7/3*99/4*2998+10*568/14'
print(re.split('[\*\-\/\+]',s)) print(re.split('[\*\-\/\+]',s,3))#分割三次
>
['', '', '', '', '', '', '', '', '', '', '', '']
['', '', '', '3+7/3*99/4*2998+10*568/14']

2.8、re.fullmath

re.fullmatch(pattern, string, flags=0)

整个字符串匹配成功就返回re object, 否则返回None

re.fullmatch('\w+@\w+\.(com|cn|edu)',"alex@oldboyedu.cn")

3、练习题

# 1 验证手机号是否合法
import re
# phone_number = input('phone_number:>').strip()
# print('phone_number:>',type(phone_number))
# if re.findall('1[0-9]{10}',phone_number):
# print('合法') # 2 验证邮箱是否合法
#
import re
# email = input('email:>').strip()
# if re.fullmatch('^\w+@\w+\.[a-zA-Z]{3}$',email):
# print('email合法')
# 3 开发一个简单的python计算器,实现加减乘除及拓号优先级解析
#用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
# 等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),
# 运算后得出结果,结果必须与真实的计算器所得出的结果一致
(). 读取文件a.txt,匹配文中所有ip地址,将所有ip地址加入到一个列表中,打印该列表。

import re

li = []
with open("a","r") as f:
for line in f:
result = re.findall(r'\d+\.\d+\.\d+\.\d+', line)
if result:
li += result
print(li) (). s = '123.33sdhf3424.34fdg323.324',计算字符串中所有数字的和
本题结果应为:123.33+3424.34+323.32 import re
s = '123.33sdhf3424.34fdg323.324sss12'
obj = re.findall(r'\d+\.\d+|\d+',s) start =
for i in obj:
start += float(i)
print(start)

15 python re 模块的更多相关文章

  1. 2015/9/15 Python基础(12):模块和包

    模块是用来组织 Python 代码的方法,而包则是用来组织模块的. 当代码量很大时,我们一般会把代码分成几个有组织的代码段,然后每个代码段之间有一定的联系.代码单之间是共享的,所以Python允许调入 ...

  2. python json模块(15)

    JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,它是一种轻量级.跨平台.跨语言的数据交换格式,其设计意图是把所有事情都用设计的字符串来表示 ...

  3. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  4. python基础-模块

    一.模块介绍                                                                                              ...

  5. Python time模块学习

    Python time模块提供了一些用于管理时间和日期的C库函数,由于它绑定到底层C实现,因此一些细节会基于具体的平台. 一.壁挂钟时间 1.time() time模块的核心函数time(),它返回纪 ...

  6. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)

    http://www.cnblogs.com/coderzh/archive/2008/05/06/1185755.html 简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格 ...

  7. Day05 - Python 常用模块

    1. 模块简介 模块就是一个保存了 Python 代码的文件.模块能定义函数,类和变量.模块里也能包含可执行的代码. 模块也是 Python 对象,具有随机的名字属性用来绑定或引用. 下例是个简单的模 ...

  8. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  9. python random模块 - 小驹的专栏 - 博客频道 - CSDN.NET

    python random模块 - 小驹的专栏 - 博客频道 - CSDN.NET python random模块 分类: python 2011-11-15 15:31 6037人阅读 评论(2) ...

随机推荐

  1. oracle for in 学习

    oracle for  in 是对于进行循环的数据处理时比较方便的 因为我们平时的操作经常会碰到进行循环的数据操作 以下为建立的例子 1. begin for item in 2..10 loop d ...

  2. Linux 下安装 Redis server

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/defonds/article/details/30047611         本文简介了 Linu ...

  3. C语言写CGI程序

    一.CGI概述 CGI(公用网关接口)规定了Web服务器调用其他可执行程序(CGI程序)的接口协议标准.Web服务器通过调用CGI程序实现和Web浏览器的交互, 也就是CGI程序接受Web浏览器发送给 ...

  4. asterisk channel driver dev ref

    入口函数load_module    load_config    ast_channel_register console_tech    ast_cli_register_multiple     ...

  5. 出现“安全时间戳无效,因为其创建时间(“2013-10-30T14:42:07.861Z”)是将来的时间。当前时间为“2013-10-30T14:36:23.988Z”,允许的时钟偏差是“00:05:00””的原因

    具体原因是服务器的时间和本地的时间不能超过5分钟,超过5分钟了.只要修改你本地机器的时间,和服务器相差的时间不能超过5分钟,就可以了. 根本原因是windows 系统域认证要求的,所有都一样.

  6. ASP.NET ASHX中获得Session

    有时候需要在ASHX中获取Session,可是一般是获取不到的,如何解决? 1-在 aspx和aspx.cs中,都是以Session["xxx"]="aaa"和 ...

  7. java学习之路之javaSE基础1

    <h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解)* A:什么是计算机?计算机在生活中的应用 ...

  8. jni头文件自动生成

    写一个测试代码,大概如下 package aa.bb; public class TestClass { public native void aaaBBB(); } 在项目的src目录下执行 jav ...

  9. Jmeter 问题集

    1.配置分布式,调度机(master) 看不到 执行机(slave). 原因: slave是放在一个交换机下面,然后在这个交换机下面又接了个路由器,control连的这个路由器 解决: CONTROL ...

  10. Java堆外内存之五:堆外内存管理类ByteBuffer

    本篇主要讲解如何使用直接内存(堆外内存),并按照下面的步骤进行说明: 相关背景-->读写操作-->关键属性-->读写实践-->扩展-->参考说明 希望对想使用直接内存的朋 ...