python import re_python re模块使用

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 = '''

歌单

歌单列表

一路上有你

沧海一声笑

往事随风

光辉岁月

记事本

但愿人长久

'''

result = re.findall('

(.*?)', 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等.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值