Python正则表达式

本文深入探讨Python正则表达式的应用,从基础语法到高级技巧,包括Pattern和Match对象的详细解析,以及如何利用正则表达式进行文本匹配、分割、查找和替换。文章还提供了实用的在线验证和练习网站链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python正则表达式

正则表达式验证网站,强烈推荐!!!

https://regexr.com/

练习题网站 https://alf.nu/RegexGolf,闯关练习,十分有意思。

简单例子

# encoding:UTF-8
import re

#将正则表达式编译成Pattern对象
pattern=re.compile(r'hello.*\!')
#使用python匹配文本,获得匹配结果,无法匹配时将返回None
match=pattern.match('hello,zjl!How are you?')
if match:
    #使用Match获得分组信息
    print(match.group())
hello,zjl!
re.compile(strPattern[,flag])

flag可选值:

re.l(re.IGNORECASE):忽略大小写(括号内时完整写法,下同)

re.M(MULTILINE):多行模式,改变’^‘和’&'的行为

re.S(DOTALL):点任意匹配模式,改变 '.'的行为

re.L(LOCALE):使预定字符类\w \W \b \B \s \S取决于当前区域舍得

re.U(UNICODE):使预定字符类 \w \W \b \B \s \S \d \D取决于unicode定义的字符熟悉

re.X(VERBOSE):详细模式。这个模式下正则表达式可以使多行,忽略空白字符,并可以加入注释。以下两个正则表达式时等价的:

regex_1=re.compile(r'''\d+ #数字部分
                        \.  #小数点部分
                        \d* #小数的数字部分''',re.X)
regex_2=re.compile(r"\d+\.\d*")

Match对象

import re
m=re.match(r'(\w+) (\w+)(?P<sign>.*)','hello zhangjinglong!')

print("m.string:",m.string)
print("m.re:",m.re)
print("m.pos:",m.pos)
print("m.endpos:",m.endpos)
print("m.lastindex:",m.lastindex)
print("m.lastgroup:",m.lastgroup)

print("m.group(1,2):",m.group(1,2))
print("m.groups():",m.groups())
print("m.groupdict():",m.groupdict())
print("m.start(2):",m.start(2))
print("m.end(2):",m.end(2))
print("m.span(2):",m.span(2))
print(r"m.expand(r'\2 \1\3'):",m.expand(r'\2  \1\3'))

m.string: hello zhangjinglong!
m.re: re.compile('(\\w+) (\\w+)(?P<sign>.*)')
m.pos: 0
m.endpos: 20
m.lastindex: 3
m.lastgroup: sign
m.group(1,2): ('hello', 'zhangjinglong')
m.groups(): ('hello', 'zhangjinglong', '!')
m.groupdict(): {'sign': '!'}
m.start(2): 6
m.end(2): 19
m.span(2): (6, 19)
m.expand(r'\2 \1\3'): zhangjinglong  hello!

Pattern对象是个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找。
Pattern不能直接实例化,必须使用re.compile()进行构造。

Pattern对象

import re
p=re.compile(r'(\w+) (\w+)(?P<sign>.*)',re.DOTALL)

print("p.pattern:",p.pattern)  #表达式字符串
print("p.flags:",p.flags)    #编译时用的匹配模式。数字形式。
print("p.groups:",p.groups)   #表达式中的分组数量
print("p.groupindex",p.groupindex)  #以表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内
p.pattern: (\w+) (\w+)(?P<sign>.*)
p.flags: 48
p.groups: 3
p.groupindex {'sign': 3}
#按照能够匹配的字串将string分割后返回列表。
import re
p=re.compile(r'\d+')
print(p.split('one1two2three3four4'))
['one', 'two', 'three', 'four', '']
#搜索string,以列表形式返回全部能匹配的字串。
p=re.compile(r'\d+')
print(p.findall('one1two2three3four4'))
['1', '2', '3', '4']
#搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器
p=re.compile(r'\d+')
for m in p.finditer('one1two2three3four4'):
    print(m.group())
1
2
3
4
#使用repl替换string中每一个匹配的字串后返回替换后的字符串
import re

p=re.compile(r'(\w+) (\w+)')
s='i say, hello zhangjinglong'

print(p.sub(r'\2  \1',s))

def func(m):
    return m.group(1).title() +' '+m.group(2).title()
print(p.sub(func,s))
say  i, zhangjinglong  hello
I Say, Hello Zhangjinglong
#subn 返回(sub(repl,string[,count]),替换次数)
import re

p=re.compile(r'(\w+) (\w+)')
s='i say, hello zhangjinglong'

print(p.subn(r'\2  \1',s))

def func(m):
    return m.group(1).title() +' '+m.group(2).title()
print(p.subn(func,s))
('say  i, zhangjinglong  hello', 2)
('I Say, Hello Zhangjinglong', 2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值