python种的re模块常用的5种方法,分别是re.match   re.search  re.findall  re.split  re.sub。

在介绍五种方法之前,需要介绍一下正则的基础。

.  表示任意字符,除\n以为

\  转义字符

[...] 字符集,表示取其中任意一个字符。比如[abc]d 可以匹配到ad bd cd。

\d  表示数字,等同于[0-9]

\D 表示非数字 [^\d]

\s  表示空格

\S   表示非空格

\w  表示单词字符 [a-zA-z_0-9]

\W 表示非单词字符 [^\w]

* 匹配前面0个或多个字符

+ 匹配前面1个或多个字符

? 匹配前面0个或1个字符

{m} 匹配前面m个字符

{m,n} 匹配前1个字符m至n次

^  匹配以什么开头

$  匹配以什么结尾

\A 匹配以什么开头

\Z 匹配以什么结尾

|  或  左右表达式取一个 ABC|def

(..) 表示一个整体,(abc){2}  匹配abc2次

(?P<name>)分组命名  比如(?P<name>tom)

\(number) 引用编号为number的分组 比如:(\d)abc\1  1abc1 

  

上述介绍了正则的一些基本语法。下面介绍的是re模块的常用方法。

一,re.match   尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

re模块可以直接使用对应的方法,比如

import re

res = re.match('\d+','123abc123')
if res:
print(res.group())

这样就可以匹配到就是123,所以输出的则是123.

但是一般使用re模块的步骤通常是 将正则表达式的字符串编译为pattern实例,然后使用pattern实例处理文本并获得匹配结果,最后使用对应方法处理。通俗的就是要使用正则,先创建正则规则,然后编译成对象。最种使用正则的对应方法处理即可。

这样的好处就是速度更快。

所以上述代码更新为:

import re
pattern = re.compile('\d+')
res = re.match(pattr, '123abc123')
if res:
print(res.group()) 

为了更直观的显示时间的区别,附上时间差的对比:

import time
import re
def timeer(fun):
def wrapper():
start_time = time.time()
fun()
stop_time = time.time()
print('{0}函数执行时间为{1}'.format(fun.__name__,stop_time-start_time))
return wrapper
@timeer
def re_compile():
pattern = re.compile('\d+')
res = re.match(pattern, '123abc123')
if res:
print(res.group())
@timeer
def re_nocompile(): res = re.match('\d+', '123abc123')
if res:
print(res.group())
re_compile() re_nocompile()

上面的re.group()这里其实是可以填写对应的数值的。默认就是0,代表输出匹配到所有字符。

import re

pattern = re.compile('(\d+)([a-z]+)(\d+)')

res = re.match(pattern,'123abc123')

if res:
print(res.group(0))
print(res.group(1))
print(res.group(2))
print(res.group(3))
print(res.groups())

0 表示输出匹配到的所有,即默认所以输出的结果为123abc123

1 表示输出第一个括号匹配到的内容,即123

2表示输出第二个括号匹配到的内容,即abc

3表示输出第三个括号匹配到的内容,即123

groups() 返回所有小组匹配到的内容,以元祖的形式输出。即(123,abc,123)

切记:match是从第一字符开始匹配,如果匹配不到,直接返回None.

二,re.search

re.search  扫描整个字符串并返回第一个成功的匹配

import re
pattern = re.compile('[a-z]+(\d+)(\w+)') res = re.search(pattern,'123abc123_') if res:
print(res.group())
print(res.group(1))
print(res.group(2)) 输出结果:
abc123_
123
_

可以发现,即使search没有匹配到123,但是它还是会往后匹配,而不是直接返回none。再看如下代码:

import re
pattern = re.compile('[a-z]+') res = re.search(pattern,'123abc123abd') if res:
print(res.group())
输出结果:abc

可见,search匹配整个字符串,找到第一个就会输出。后面的则不匹配。

简单小结:

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

三,re.findall   在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。findall是没有group方法的。

import re
pattern = re.compile('[a-z]+') res = re.findall(pattern,'123abc123abd') print(res) 输出结果:['abc', 'abd']

可见该正则会将匹配到内容按列表的形式输出,它不仅仅是匹配一次,这个是它和search的区别

四, re.split 匹配分割字符串

import re
pattern = re.compile('[a-z]+') res = re.split(pattern,'123abc123abd') print(res) 输出结果:['123', '123', '']

 

五, re.sub 匹配替换

import re

pattern = re.compile('[a-z]+')

res = re.sub(pattern,'000','123abc123')

print(res)

输出结果:123000123

  

 值得注意的是:正则中* + 都是贪婪匹配,?是非贪婪匹配。所以如果你要想要限制住*的贪婪匹配,可以在*的后面添加?来限制。比如
 
line = '手机号:15200000000,生日:0802'
reg_str1 = '.*:'
reg_str2 = '.*?:' match_obj1 = re.match(reg_str1,line)
match_obj2 = re.match(reg_str2,line) if match_obj1:
print(match_obj1.group()) if match_obj2:
print(match_obj2.group()) 输出结果:
手机号:15200000000,生日:
手机号: 可见,?是可以限制住*的贪婪匹配的!!!

  

装b可用:分组,可以给匹配到的内容设置名称生成字典。
 
import re
re = re.search('(?P<id>[0-9]+)(?P<name>[a-zA-Z]+)','abcd1233bob@34')
if re:
print(re.group())
print(re.groupdict()) 输出结果:
1233bob
{'id': '1233', 'name': 'bob'}
#比如匹配身份证,
import re id = '360201199011113721' res = re.search('(?P<Province_code>[0-9]{2})(?P<City_code>[0-9]{2})(?P<County_code>[0-9]{2})(?P<birthday>[0-9]{8})(?P<policestation_id>[0-9]{2})(?P<sexid>[0-9]{1})(?P<checkid>[0-9]{1})',id) if res:
print(res.group())
print(res.groupdict()) 输出结果:
360201199011113721
{'Province_code': '36', 'City_code': '02', 'County_code': '01', 'birthday': '19901111', 'policestation_id': '37', 'sexid': '2', 'checkid': '1'}

  

  

python常用模块之re模块(正则)的更多相关文章

  1. Python常用内置模块之xml模块

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  2. Python常用的内建模块

    PS:Python之所以自称“batteries included”,就是因为内置了许多非常有用的模块,无需额外安装和配置,即可直接使用.下面就来看看一些常用的内建模块. 参考原文 廖雪峰常用的内建模 ...

  3. Python常用数据结构之collections模块

    Python数据结构常用模块:collections.heapq.operator.itertools collections collections是日常工作中的重点.高频模块,常用类型由: 计数器 ...

  4. Python常用数据结构之heapq模块

    Python数据结构常用模块:collections.heapq.operator.itertools heapq 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小 ...

  5. python常用函数库及模块巧妙用法汇总

    在用python编写脚本或写程序过程中总要遇到一些对大文件或数据进行排序,计算,循环跌代等.我想下面这些函数库一定能用得到,总结如下:便于以后备查 列表去重(传说是列表去重最高效的方法): al = ...

  6. python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

    python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess ...

  7. Python开发【第五章】:Python常用模块

    一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...

  8. Day05 - Python 常用模块

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

  9. Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  10. 7.python常用模块

    1.time 常用表示时间方式: 时间戳,格式化的时间字符串,元组(struct_time) UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时 ...

随机推荐

  1. Keras 资源

    Keras中文文档 github Keras example 官方博客 A ten-minute introduction to sequence-to-sequence learning in Ke ...

  2. Python模块——PrettyTable 模块

    简介 PrettyTable 是python中的一个第三方库,可用来生成美观的ASCII格式的表格,十分实用. 安装 pip install prettytable 示例 从已有文件创建 CSV fr ...

  3. Comparable接口和Comparator接口的不同用法

    两者都可用来在定义比较方法,然后用在排序中. Comparable是类本身继承的接口 Comparator实在类外定义一个排序的类 比较而言,觉得Comparator更灵活一些,但是Comparabl ...

  4. C# 根据Combobox控件来动态显示TabControl下的子元素

    根据下来列表来动态显示TabControl下的元素 需要准备两个控件:Combobox (命名为:cbPrjType)和 TabControl (命名为:tabPrjType),TabControl下 ...

  5. 没有安装hiredis

    在redis的发行包中的deps目录中就包含hiredis的源码,手动编译安装,或者自行下载一份.地址:hiredis的地址 cd /deps/hiredis make make install 然后 ...

  6. spring boot 2.0 源码分析(一)

    在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...

  7. Angular2入门:TypeScript的类型 - 类型、null、undefined

  8. Vim 字符串替换命令

    命令模式下输入如下命令可实现替换: s/str1/str2/ 替换当前行第一个 str1 为 str2 s/str1/str2/g 替换当前行中所有的 str1 为 str2 m,ns/str1/st ...

  9. .Net实现微信公众平台开发接口(一) 之 “微信开发配置”

    我们只要通过微信官方认证,成为开发者,才能实现微信提供的各种接口,否则即使调用了接口,微信也不会实现推送,功能也无法通过开发模式真正得到实现,所以需要正确配置微信信息,通过微信官方认证,成为开发者才可 ...

  10. 程序员快速掌握的UI设计技巧

    一.概要 功能与内在很关键,UI与外表也重要. 1.1.选择主色调 1.1.1.三原色 三原色指色彩中不能再分解的三种基本颜色,我们通常说的三原色,即红.黄.蓝.三原色可以混合出所有的颜色,同时相加为 ...