re.findall() 查找字符

从字符串中找出符合模式的字符序列:findall(模式(正则表达式),目标字符串), 返回值为list类型,list元素为匹配出的各个字符串
如:

import re

a = "java|python12988"    
b =  re.findall("java", a)
c = re.findall("\d",a)
print(b,c)

结果

['java'] ['1', '2', '9', '8', '8']

findall()函数还有第三个参数匹配模式,使用多个模式可以用'|'将各个模式分开,并且所有模式可以同时生效
re.I

import re

language = "PythonC#JavaPHP"
r = re.findall('c#', language)
print(r)

结果为

[]

默认情况下区分大小写,所以'c#'并不能匹配出原字符串中的'C#'
编辑第三个参数为re.I,使得匹配不受字母大小写影响

import re

language = "PythonC#JavaPHP"
r = re.findall('c#', language, re.I)
print(r)

结果为

['C#']

re.S

import re

language = "PythonC#\nJavaPHP"
r = re.findall('c#.{1}', language, re.I) # "."匹配出除换行符外的所有字符
print(r)

结果为

[]

加上模式re.S,可以改变"."的行为,将其匹配出换行符

import re

language = "PythonC#\nJavaPHP"
r = re.findall('c#.{1}', language, re.I | re.S) # "."匹配除换行符外的所有字符
print(r)

结果为

['C#\n']

re.sub()正则替换,替换字符

re.sub(要替换的字符,替换后字符,目标字符串,替换个数),返回值为替换后的字符串
如:

import re

language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#','GO',language)
print(r)

结果为

PythonGOJavaGOPHPGO

上例中,替换个数默认为0,加入替换个数参数
如:

import re

language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#','GO',language,count=1)
print(r)

结果为

PythonGOJavaC#PHPC#

结果就只把第一个C#给替换了
效果与python的内置函数replace()一样

re.sub()的第二个参数也可以传入一个函数
如:

import re

def convert(value):
    print(value)

language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#', convert, language)
print(r)

结果为打印出了三个match对象,span表示了匹配到的字符的位置

<_sre.SRE_Match object; span=(6, 8), match='C#'>
<_sre.SRE_Match object; span=(12, 14), match='C#'>
<_sre.SRE_Match object; span=(17, 19), match='C#'>
PythonJavaPHP

说明'C#'被匹配到了三次,每次都会调用convert函数,由于该函数没有返回值,所以返回的字符串的'C#'被去掉了
改写上例,由于value是个对象,所以可以调用value的group()方法获得所要匹配的'C#'

import re

def convert(value):
    matched = value.group()
    return '!!' + matched + '!!'

language = 'PythonC#JavaC#PHPC#'
r = re.sub('C#', convert, language)
print(r)

结果'C#'被成功替换成了'!!C#!!':

Python!!C#!!Java!!C#!!PHP!!C#!!

由于re.sub()的第二个参数可以传入一个函数,所以可以对字符串进行各种复杂的操作
例如:
将字符串'ABC24525DEF22698'中所有小于等于4的数字替换成0,大于4的数字替换成9,就可以编辑convert函数实现这个功能

import re

def convert(value):
    matched = value.group()
    if int(matched) <= 4:
        return '0'
    else:
        return '9'

language = 'ABC24525DEF22698'
r = re.sub('\d', convert, language)
print(r)

打印结果为:

ABC00909DEF00999

将函数作为参数传入另一个函数是函数式编程
re.match()和re.search()

re.match()从字符串的起始位置匹配,若起始位置不符合正则表达式,则返回空
re.search()搜索整个字符串,返回第一个匹配的结果

两个函数若都能匹配到结果,那么返回的结果也是一个match对象
match对象的方法除了有group()之外还有span()方法,可以返回匹配结果的位置

而re.findall()方法就是把所有的匹配结果返回

1. match()方法, 从字符串头部开始匹配

import re

content = 'The 123456 is my one phone number.'
print(len(content)) #字符串长度
result = re.match(r'^The\s\d+\s\w*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
print(result)
print(result.group()) #输出匹配内容
print(result.span()) #输出匹配内容的位置索引

结果:

34
<_sre.SRE_Match object; span=(0, 13), match='The 123456 is'>
The 123456 is
(0, 13)

2. 匹配目标

import re

content = 'The 123456 is my one phone number.'
print(len(content)) #字符串长度
result = re.match(r'^The\s(\d+)\sis', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
print(result)
print(result.group()) #输出匹配内容
print(result.group(1)) #输出第一个被()包裹的内容
print(result.span()) #输出匹配内容的位置索引

结果:

34
<_sre.SRE_Match object; span=(0, 13), match='The 123456 is'>
The 123456 is
123456
(0, 13)

在正则表达式中用()括起来可以使用group()输出, 若有n个(), 那么可以表示为group(n), 输出第n个括号匹配的内容.
3.通用匹配

import re

content = 'The 123456 is my one phone number.'
result = re.match(r'^The.*number.$', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
print(result)
print(result.group()) #输出匹配内容
print(result.span()) #输出匹配内容的位置索引

结果:

<_sre.SRE_Match object; span=(0, 34), match='The 123456 is my one phone number.'>
The 123456 is my one phone number.
(0, 34)

其中 . 表示匹配任意字符, *表示匹配前面字符无限次.
4.贪婪与非贪婪

import re

content = 'The 123456 is my one phone number.'
print('贪婪匹配:')
result = re.match(r'^The.*(\d+).*', content) #使用match匹配, 第一个参数为正则表达式, 第二个为要匹配的字符串
print(result.group()) #输出匹配内容
print('result = %s'%result.group(1)) #输出第一个被()包裹的内容
print('-'*20)
print('非贪婪匹配:')
result = re.match(r'^The.*?(\d+).*', content)
print(result.group())
print('result = %s'%result.group(1))

结果:

贪婪匹配:
The 123456 is my one phone number.
result = 6
--------------------
非贪婪匹配:
The 123456 is my one phone number.
result = 123456

5.修饰符 re.S

import re

content = '''The 123456 is
one of my phone.
'''
result = re.match('^The.*?(\d+).*?phone.', content, re.S)
if result:
    print(result.group(1))
else:
    print('result = None')
result2 = re.match('^The.*?(\d+).*?phone.', content)
if result2:
    print(result2.group(1))
else:
    print('result2 = None')

结果:

123456
result2 = None

由于加上re.S参数后, 通配符 . 将可以匹配换行符, 所以result不为空, result2为空. 出了re.S, 还有许多修饰符如, re.I: 使用匹配时忽略大小写.
6.转义匹配

import re

content = '(百度)www.baidu.com'
result = re.match('(百度)www.baidu.com', content)
result2 = re.match('\(百度\)www\.baidu\.com', content)
if result:
    print(result.group())
else:
    print('result = None')
if result2:
    print(result2.group())
else:
    print('result2 = None')

结果:

result = None
(百度)www.baidu.com

由于()属于正则表达式的特殊字符, 因此在需要匹配()时, 需要加上转义字符’’.
7.search()方法, 与match()方法不同, 不需要从头部开始匹配

import re

content = 'Other The 123456 is my one phone number.'
result = re.search('The.*?(\d+).*?number.', content)
print(result.group())

结果:

The 123456 is my one phone number.

8.findall()方法, match()和search()都是返回匹配到的第一个内容就结束匹配, findall()是返回所有符合匹配规则的内容

import re

html = '''
<div id="songs-list">
<h2 class="title">歌单</h2>
<p class="introduction">歌单列表</p>
<ul id="list" class="list-group">
<li data-view="2">一路上有你</li>
<li data-view="7">
<a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
</li>
<li data-view="4" class="active">
<a href="/3.mp3" singer="齐秦">往事随风</a>
</li>
<li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
<li data-view="5"><a href="/5.mp3" singer="程慧玲">记事本</a></li>
<li data-veiw="5">
<a href="/6.mp3" singer="邓丽君">但愿人长久</a>
</li>
</ul>
</div>
'''

result = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
if result:
    print(result)
    for res in result:
        print(res[0], res[1], res[2])

[('/2.mp3', '任贤齐', '沧海一声笑'), ('/3.mp3', '齐秦', '往事随风'), ('/4.mp3', 'beyond', '光辉岁月'), ('/5.mp3', '程慧玲', '记事本'), ('/6.mp3', '邓丽君', '但愿人长久')]
/2.mp3 任贤齐 沧海一声笑
/3.mp3 齐秦 往事随风
/4.mp3 beyond 光辉岁月
/5.mp3 程慧玲 记事本
/6.mp3 邓丽君 但愿人长久

9.sub()方法, 去除匹配的字符

第二个参数是两个’,表示吧’\d+\ 匹配的内容替换成空,如果写sub(’\d+’, ‘-’), 则把匹配的内容替换成 -。

import re

content = '54abc59de335f7778888g'
content = re.sub('\d+', '', content)
print(content)

结果:

abcdefg

1

10.compile()

import re

content1 = '2016-1-1 12:01'
content2 = '2017-1-1 12:02'
content3 = '2018-1-1 12:03'

pattern = re.compile('\d{2}:\d{2}')
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3)

结果:

2016-1-1  2017-1-1  2018-1-1

在需要匹配相同正则表达式情况下, 事先定义一个compile可以简化代码量, 同时compile中也可以使用修饰符r.S等.

python re模块使用的更多相关文章

  1. Python标准模块--threading

    1 模块简介 threading模块在Python1.5.2中首次引入,是低级thread模块的一个增强版.threading模块让线程使用起来更加容易,允许程序同一时间运行多个操作. 不过请注意,P ...

  2. Python的模块引用和查找路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...

  3. Python Logging模块的简单使用

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

  4. Python标准模块--logging

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  5. python基础-模块

    一.模块介绍                                                                                              ...

  6. python 安装模块

    python安装模块的方法很多,在此仅介绍一种,不需要安装其他附带的pip等,python安装完之后,配置环境变量,我由于中英文分号原因,环境变量始终没能配置成功汗. 1:下载模块的压缩文件解压到任意 ...

  7. python Queue模块

    先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...

  8. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  9. Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...

  10. Python Paramiko模块与MySQL数据库操作

    Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...

随机推荐

  1. ARMv8 内存管理架构.学习笔记

    http://blog.csdn.net/forever_2015/article/details/50285955 版权声明:未经博主允许不得转载,请尊重原创, 谢谢!   目 录 第1章 分级存储 ...

  2. Name your feature branches by convention

    https://docs.microsoft.com/en-us/azure/devops/repos/git/git-branching-guidance?view=azure-devops Nam ...

  3. 95、自然语言处理svd词向量

    import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like& ...

  4. HBase 入门之数据刷写(Memstore Flush)详细说明

    接触过 HBase 的同学应该对 HBase 写数据的过程比较熟悉(不熟悉也没关系).HBase 写数据(比如 put.delete)的时候,都是写 WAL(假设 WAL 没有被关闭) ,然后将数据写 ...

  5. js的内部特性--属性

    使用方法:通过调用Object.defineProperty(对象,"对象属性",{}进行的操作}) 当对一个对象的属性的属性类型中vlue设置为一个值时,则这个对象的这个属性的值 ...

  6. 浅析Draw Call

    Draw Call是CPU对GPU的一种命令,仅仅指向一个需要被渲染的图元列表,在OpenGL和DirectX中分别体现为glDrawElements和DrawIndexedPrimitive图像编程 ...

  7. 慎用margin系列3---IE6下3px bug

    当我们想让一段文字出现在一个布局块的右边的时候,我们会让布局块向左浮动,然后把段落设置左布局块宽度大小的左空白.比如左布局块是.a{float:left;height: 110px;width: 28 ...

  8. MES training

    unique identity 1.project name , namespace 2. select XML (not html) 3. view and controller will be i ...

  9. ionic node-sass安装或编译失败:MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”

    错误原因:缺少windows构建插件 解决方法:npm install --global --production windows-build-tools  (如果目录在C盘下,需要管理员权限运行,全 ...

  10. VMware虚拟机提示找不到vmnetbridge.dl文件的解决办法

    把vmware workstation删了重装,估计是异地安装包在安装时候出现的问题. 先把安装包拷贝到本地,然后控制面板上把已有的vmware workstation删除. 最后重新安装VMware ...