python基础(正则表达式)

正则表达式用于搜索、替换和解析字符串。正则表达式遵循一定的语法规则,使用非常灵活,功能强大。使用正则表达式编写一些逻辑验证非常方便,例如电子邮件地址格式的验证。python提供了re模块实现正则表达式的验证。

1.简介
正则表达式是用于文本匹配的工具,它在源字符串中查找与给定的正则表达式相匹配的部分,一个正则表达式是由字母、数字和特殊字符(括号、星号、问号)组成,正则表达式中有许多特殊的字符,这些特殊字符是构成正则表达式的要素。

正则表达式中的特殊字符:
^ —–正则表达式的开始符号
$ —–正则表达式的结束符号
\w ——匹配字母、数字、下划线
\W —–匹配不是字母、数字、下划线的字符
\s —–匹配空白字符
\S —–匹配不是空白的字符
\d —-匹配数字
\D —-匹配非数字的字符
\b —-匹配单词的开始和结束
\B —-匹配不是单词开始和结束
. —-匹配任意字符,包括汉字

如果要匹配电话号码,需要形如“\d\d\d\d-\d\d\d\d\d\d\d”这样的正则表达式,其中出现了11次“\d”,表达方式繁琐,正则表达式提供了对表达式的一部分进行重复处理的功能。

正则表达式中的常用限定符:
* —–匹配零次或多次
+ —–匹配一次或多次
? —–匹配一次或零次
{m} —-重复m次
{m,n} —重复m到n次,其中n可以省略

利用{}可以控制字符重复的次数,例如\d{1,4}表示1~3位数字,前面提到的电话号码采用如下的正则表达式:

\d{3}-\d{8}|\d{4}-\d{7}

如果要对正则表达式进行嵌套,就需要使用分组“()”,例如,对3位数字重复3次,可以使用如下的正则表达式表示:

(\d\d\d){2}

默认情况下,正则表达式将匹配最长的字符串作为结果,可以通过在限定符后面添加“?”的方式,获取最短的匹配结果,例如,对字符“a”到字符“c”之间的字符进行匹配。

2.使用re模块处理正则表达式
python的re模块具有正则表达式匹配的功能,re模块提供了一些根据正则表达式进行查找、替换、分隔字符串的函数,这些函数使用一个正则表达式作为第一个参数。

re模块的常用函数:
findall(pattern,string,flags=0):根据pattern在string中匹配字符串。如果匹配成功,返回包含匹配结果的结果列表,否则,返回空列表。

sub(pattern,repl,string,count=0):根据指定的正则表达式,替换源字符串中的 子串。pattern是一个正则表达式,repl是用于替换的字符串,string是源字符串,如果count等于0,则返回string中匹配的所有结果,如果,count大于0,则返回前count个匹配结果。

match(pattern,string,flags=0):根据pattern从string的开头匹配字符串,只返回第一次匹配成功的对象,否则,返回None

search(pattern,string,flags=0):根据pattern从string中匹配字符串,只返回第一次匹配成功的对象,否则,返回None

compile(pattern,flags=0)编译正则表达式pattern,返回一个pattern对象。

escape(pattern):匹配字符串中的特殊字符,如*、+、?等

练习1:

import re

#^与$的使用

s = "HELLO WORLD"
print(re.findall(r"^hello",s))  #默认区分大小写的从字符串开头匹配以“hello”开始的字符串
print(re.findall(r"hello",s,re.I))  #re.I为辅助参数,表示忽略大小写,不区分大小写的从字符串开头匹配以“hello”开始的字符串
print(re.findall(r"woRLD$",s))    #默认区分大小写的从字符串尾部匹配以“hello”开始的字符串
print(re.findall(r"woRLD$",s,re.I))  #不区分大小写的从字符串尾部匹配以“hello”开始的字符串

print(re.findall(r"\b\w+\b",s))   #匹配每个英文单词


s = "hello world"
print(re.sub("hello","hi",s))
print(re.sub("hello","hi",s[-4:]))  #在切片是[-4:]范围内替换“hello”,即在字符串“orld”中替换“hello”
print(re.sub("world","China",s[-5:]))  #在分片s[-5:]范围内替换“world”,即把字符串“world”替换为“China”


s = "你好 WORLD2"
print("匹配字母数字:"+re.sub(r"\w","hi",s))
print("替换次数:"+str(re.subn(r"\w","hi",s)[1]))
print("匹配任意字符:"+re.sub(r".","hi",s))
print("替换次数:"+str(re.subn(r".","hi",s)[1]))

运行结果:

D:\Python36\python.exe E:/demo_py/python/char_6/re_sign.py
[]
['HELLO']
[]
['WORLD']
['HELLO', 'WORLD']
hi world
orld
China
匹配字母数字:hihi hihihihihihi
替换次数:8
匹配任意字符:hihihihihihihihihi
替换次数:9

练习2:

import re

tel1 = "0791-1234567"
print(re.findall(r"\d{3}-\d{8}|\d{4}-\d{7}",tel1))  #匹配区号为3位的8位数电话号码或区号为4为的7位数电话号码,区号和电话号码之间用—连接

tel2 = "010-12345678"
print(re.findall(r"\d{3}-\d{8}|\d{4}-\d{7}",tel2))

tel3 = "(010)12345678"
print(re.findall(r"[\( ]?\d{3}[\]-]?\d{8}|[\( ]?\d{4}[\]-]?\d{7}",tel3)) #匹配区号为3位的8位数电话号码或区号为4为的7位数电话号码,区号和电话号码之间用—连接,或区号两侧加圆括号

运行结果:

D:\Python36\python.exe E:/demo_py/python/char_6/re_number.py
['0791-1234567']
['010-12345678']

练习3:

import re

s = "1abc23def45"
p = re.compile(r"\d+")  #返回一个正则表达式对象P,匹配变量s中的数字
print(p.findall(s))  #调用p中的findall()方法,匹配的结果存放在列表中
print(p.pattern)   #输出当前使用的正则表达式


p = re.compile(r"(abc)\1")  #定义一个分组"(abc)",在后面使用“1”再次调用该分组,compile()返回一个包含2个分组的正则表达式对象P
m = p.match("abcabcabc")  #对字符串进行搜索,返回一个match对象m
print(m.group(0))   #匹配0号组
print(m.group(1))   #匹配1号组
print(m.group())    #默认返回0号组

p = re.compile(r"(?P<one>)abc(?P=one)")  #给分组命名one表示分组的名称,“(?P=one)调用分组one,相当于“\1””
m = p.search("abcabcabc")
print(m.group("one"))
print(m.groupdict().keys())  #获取正则表达式中分组的名称
print(m.groupdict().values())#获取正则表达式中分组的内容
print(m.re.pattern)  #获取当前使用的正则表达式

运行结果:

D:\Python36\python.exe E:/demo_py/python/char_6/re.compiler.py
['1', '23', '45']
\d+
abcabc
abc
abcabc

dict_keys(['one'])
dict_values([''])
(?P<one>)abc(?P=one)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值