python正则匹配_Python3正则匹配re.split,re.finditer及re.findall函数用法详解

本文实例讲述了Python3正则匹配re.split,re.finditer及re.findall函数用法。分享给大家供大家参考,具体如下:

re.split re.finditer re.findall

@(python3)

官方 re 模块说明文档

re.compile() 函数

编译正则表达式模式,返回一个对象。可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率。

re 模块最离不开的就是 re.compile 函数。其他函数都依赖于 compile 创建的 正则表达式对象

re.compile(pattern, flags=0)

pattern 指定编译时的表达式字符串

flags 编译标志位,用来修改正则表达式的匹配方式。支持 re.L|re.M 同时匹配

flags 标志位参数

re.I(re.IGNORECASE)使匹配对大小写不敏感

re.L(re.LOCAL)做本地化识别(locale-aware)匹配

re.M(re.MULTILINE)多行匹配,影响 ^ 和 $

re.S(re.DOTALL)使 . 匹配包括换行在内的所有字符

re.U(re.UNICODE)根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.

re.X(re.VERBOSE)该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

示例:

import re

content = 'Citizen wang , always fall in love with neighbour,WANG'

rr = re.compile(r'wan\w', re.I) # 不区分大小写

print(type(rr))

a = rr.findall(content)

print(type(a))

print(a)

findall 返回的是一个 list 对象

['wang', 'WANG']

re.split 函数

按照指定的 pattern 格式,分割 string 字符串,返回一个分割后的列表。

re.split(pattern, string, maxsplit=0, flags=0)

pattern compile 生成的正则表达式对象,或者自定义也可

string 要匹配的字符串

maxsplit 指定最大分割次数,不指定将全部分割

import re

str = 'say hello world! hello python'

str_nm = 'one1two2three3four4'

pattern = re.compile(r'(?P\s)') # 创建一个匹配空格的正则表达式对象

pattern_nm = re.compile(r'(?P\d+)') # 创建一个匹配空格的正则表达式对象

match = re.split(pattern, str)

match_nm = re.split(pattern_nm, str_nm, maxsplit=1)

print(match)

print(match_nm)

结果:

['say', ' ', 'hello', ' ', 'world!', ' ', 'hello', ' ', 'python']

['one', '1', 'two2three3four4']

re.findall() 方法

返回一个包含所有匹配到的字符串的列表。

pattern 匹配模式,由 re.compile 获得

string 需要匹配的字符串

import re

str = 'say hello world! hello python'

pattern = re.compile(r'(?Ph\w)(?Pl+)(?Po\s)') # 分组,0 组是整个 world!, 1组 or,2组 ld!

match = re.findall(pattern, str)

print(match)

结果

[('he', 'll', 'o '), ('he', 'll', 'o ')]

re.finditer 、re.findall

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

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

pattern compile 生成的正则表达式对象,或者自定义也可

string 要匹配的字符串

findall 返回一个包含所有匹配到的字符的列表,列表类以元组的形式存在。

finditer 返回一个可迭代对象。

示例一:

pattern = re.compile(r'\d+@\w+.com') #通过 re.compile 获得一个正则表达式对象

result_finditer = re.finditer(pattern, content)

print(type(result_finditer))

print(result_finditer) # finditer 得到的结果是个可迭代对象

for i in result_finditer: # i 本身也是可迭代对象,所以下面要使用 i.group()

print(i.group())

result_findall = re.findall(pattern, content)

print(type(result_findall)) # findall 得到的是一个列表

print(result_findall)

for p in result_finditer:

print(p)

输出结果:

123456@163.com

234567@163.com

345678@163.com

['123456@163.com', '234567@163.com', '345678@163.com']

由结果可知:finditer 得到的是可迭代对象,finfdall 得到的是一个列表。

示例二:

import re

content = '''email:123456@163.com

email:234567@163.com

email:345678@163.com

'''

pattern = re.compile(r'(?P\d+)@(?P\w+).com')

result_finditer = re.finditer(pattern, content)

print(type(result_finditer))

print(result_finditer)

iter_dict = {} # 把最后得到的结果

for i in result_finditer:

print('邮箱号码是:', i.group(1),'邮箱类型是:',i.group(2))

number = i.group(1)

mail_type = i.group(2)

iter_dict.setdefault(number, mail_type) # 使用 dict.setdefault 创建了一个字典

print(iter_dict)

print('+++++++++++++++++++++++++++++++')

result_findall = re.findall(pattern, content)

print(result_findall)

print(type(result_findall))

输出结果:

邮箱号码是: 123456 邮箱类型是: 163

邮箱号码是: 234567 邮箱类型是: 163

邮箱号码是: 345678 邮箱类型是: 163

{'123456': '163', '234567': '163', '345678': '163'}

+++++++++++++++++++++++++++++++

[('123456', '163'), ('234567', '163'), ('345678', '163')]

finditer 得到的可迭代对象 i,也可以使用 lastindex,lastgroup 方法。

print('lastgroup 最后一个被捕获的分组的名字',i.lastgroup)

findall 当正则没有分组,返回就是正则匹配。

re.findall(r"\d+@\w+.com", content)

['2345678@163.com', '2345678@163.com', '345678@163.com']

有一个分组返回的是分组的匹配

re.findall(r"(\d+)@\w+.com", content)

['2345678', '2345678', '345678']

多个分组时,将结果作为 元组,一并存入到 列表中。

re.findall(r"(\d+)@(\w+).com", content)

[('2345678', '163'), ('2345678', '163'), ('345678', '163')]

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:http://tools.jb51.net/regex/javascript

正则表达式在线生成工具:http://tools.jb51.net/regex/create_reg

更多关于Python相关内容可查看本站专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

本文标题: Python3正则匹配re.split,re.finditer及re.findall函数用法详解

本文地址: http://www.cppcns.com/jiaoben/python/229963.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值