python正则表达式research_Python正则表达式说明-重新匹配() - 搜索() - 重新编译() - 关于芬德尔() - 重新分割(),详解,rematchresearchre...

本文详细介绍了Python的正则表达式库`re`,包括`re.match()`、`re.search()`、`re.compile()`等函数的用法,以及正则表达式的各种模式和标志。通过实例演示了如何进行字符串匹配、分组、获取匹配范围等操作,是Python正则表达式学习的重要参考。
摘要由CSDN通过智能技术生成

re.match()

re.match() 按照模式从字符串的起始位置匹配,起始位置匹配成功,则返回一个匹配的对象,否则就返回 None。

函数语法:

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

pattern:匹配的正则表达式

string:被匹配的字符串

flags:可选标志修饰符(用来控制正则表达式匹配的模式)

flags可选标志(如下表,多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M)

修饰符

描述

re.I

使匹配对大小写不敏感

re.L

做本地化识别(locale-aware)匹配

re.M

多行匹配,影响 ^ 和 $

re.S

使 . 匹配包括换行在内的所有字符

re.U

根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B

e.X

该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

正则表达式(如下表,不用刻意去记,用的时候来查就好了)

有了上面表格的参照,再来看例子:

import re

print(re.match('www', 'www.runoob.com')) # 在起始位置匹配, 返回对象

print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配, 返回None

输出:

None

import re

line = "Cats are smarter than dogs"

# .* 表示任意匹配除换行符(\n、\r)之外的任何单个或多个字符

# .*? 表示匹配.* 定义的0个或者1个片断

# re.M | re.I 表示多行匹配 或 使匹配对大小写不敏感

matchObj = re.match(r'(.*) are (.*?) .*', line, re.M | re.I)

print(matchObj)

if matchObj: # 条件语句:如果匹配到了的话,则执行

""" group([group1, …]) 方法用于获得一个或多个分组(一对小括号代表一个分组)匹配的字符串,

当要获得整个匹配的子串时,可直接使用 group() 或 group(0) """

print(matchObj.group()) # 获得整个匹配的子串

print(matchObj.group(1)) # 获得第一组匹配的子串

print(matchObj.group(2)) # 获得第二组匹配的子串

print(matchObj.group(1, 2)) # 获得第一组和第二组匹配的子串, 以元组的形式返回

else:

print("No match!!")

if matchObj:

""" start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),

start() 或 start(0)表示整个字符串的第一个字符的索引 """

print(matchObj.start()) # 获得整个字符串的第一个字符的索引

print(matchObj.start(1)) # 获得第一组匹配的子串在整个字符串中的索引(即Cats的C字符的索引)

print(matchObj.start(2)) # 获得第一组匹配的子串在整个字符串中的索引(即smarter的s字符的索引)

else:

print("No match!!")

if matchObj:

""" end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),,

end() 或 end(0)表示整个字符串的最后一个字符的索引+1 """

print(matchObj.end()) # 获得整个字符串的最后一个字符的索引+1

print(matchObj.end(1)) # 获得第一组匹配的子串在整个字符串中的索引+1(即Cats的s字符的索引+1)

print(matchObj.end(2)) # 获得第一组匹配的子串在整个字符串中的索引+1(即smarter的r字符的索引+1)

else:

print("No match!!")

if matchObj:

""" span([group]) 方法返回 (start(group), end(group)) """

print(matchObj.span())

print(matchObj.span(1))

print(matchObj.span(2))

else:

print("No match!!")

输出:

Cats are smarter than dogs

Cats

smarter

('Cats', 'smarter')

0

0

9

26

4

16

(0, 26)

(0, 4)

(9, 16)

re.search()

re.search() 扫描整个字符串并返回第一个成功的匹配,匹配成功则返回一个匹配的对象,否则返回 None

函数语法:

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

pattern:匹配的正则表达式

string:被匹配的字符串

flags:可选标志修饰符(用来控制正则表达式匹配的模式)

看懂上面那个 match 函数的例子,这个就很简单了:

import re

print(re.search('www', 'www.runoob.com').span())

print(re.search('com', 'www.runoob.com').span())

line = "Cats are smarter than dogs"

searchObj = re.search(r'(.*) are (.*?) .*', line, re.M | re.I)

if searchObj:

print("searchObj.group() : ", searchObj.group())

print("searchObj.group(1) : ", searchObj.group(1))

print("searchObj.group(2) : ", searchObj.group(2))

else:

print("Nothing found!!")

输出:

(0, 3)

(11, 14)

searchObj.group() : Cats are smarter than dogs

searchObj.group(1) : Cats

searchObj.group(2) : smarter

re.compile()

compile () 用于编译正则表达式,返回一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

函数语法:

re.compile(pattern[, flags])

pattern : 一个字符串形式的正则表达式

flags:可选标志修饰符(用来控制正则表达式匹配的模式)

import re

# 返回一个用于匹配至少一个数字的正则表达式对象, 给match()和search()调用

pattern = re.compile(r'\d+')

# 从起始位置开始匹配,没有匹配到,返回 None

m = pattern.match('one12twothree34four')

print(m)

# 把'e'的位置作为起始位置匹配,没有匹配到,返回 None

m = pattern.match('one12twothree34four', 2, 10)

print(m)

# 把'1'的位置作为起始位置匹配,正好匹配

m = pattern.match('one12twothree34four', 3, 10)

print(m)

print(m.group())

print(m.start())

print(m.end())

print(m.span())

输出:

None

12

3

5

(3, 5)

import re

print(re.match('www', 'www.runoob.com')) # 在起始位置匹配, 返回对象

print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配, 返回None

""" 在用pattern调用match()或者search()时,里面有两个参数:

pos:指定起始匹配位置的索引 endpos: 指定结束位置的索引+1 """

pattern = re.compile('com')

print(pattern.match('www.runoob.com'))

print(pattern.match('www.runoob.com', pos=11, endpos=14))

输出:

None

None

re.findall()

findall() 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。(注意: match 和 search 是匹配一次,findall 是匹配所有)

函数语法:

findall(string[, pos[, endpos]])

string:待匹配的字符串

pos:可选参数,指定字符串的起始位置,默认为 0

endpos:可选参数,指定字符串的结束位置,默认为字符串的长度

import re

pattern = re.compile(r'\d+') # 查找数字

result1 = pattern.findall('runoob 123 google 456')

# 同样也是在pattern调用findall()才会有pos和endpos参数

result2 = pattern.findall('run88oob123google456', 0, 10)

result3 = re.findall(pattern, 'run88oob123google456')

result4 = re.findall(r'\d+', 'run88oob123google456')

print(result1)

print(result2)

print(result3)

print(result4)

输出:

['123', '456']

['88', '12']

['88', '123', '456']

['88', '123', '456']

re.split()

split() 按照匹配的子串将字符串分割后返回列表

函数语法:

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

pattern:匹配的正则表达式

string:被匹配的字符串

maxsplit:分隔次数,maxsplit = 1 分隔一次,默认为 0,不限制次数

flags:可选标志修饰符(用来控制正则表达式匹配的模式)

import re

pattern = re.compile(r'\d+') # 查找数字

result1 = pattern.findall('runoob 123 google 456')

# 同样也是在pattern调用findall()才会有pos和endpos参数

result2 = pattern.split('run88oob123google456', 0, 10)

result3 = re.findall(pattern, 'run88oob123google456')

result4 = re.findall(r'\d+', 'run88oob123google456')

print(result1)

print(result2)

print(result3)

print(result4)

输出:

['runoob,', 'runoob,', 'runoob.']

['', ' ', 'runoob,', ' ', 'runoob,', ' ', 'runoob.']

['', 'runoob, runoob, runoob.']

['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']

['', 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '']

欢迎

指正

- 欢迎

点赞

- 欢迎

收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值