正则表达式
具有特殊意义的专用字符''^"和''$''表示匹配(意思可以在里面找到)的开始和结束
元字符
| 元字符 |
描述说明 |
举例 |
结果 |
| . |
匹配任意字符(除\n) |
'p\nytho\tn' |
p,y,t,h,o,\t,n |
| \w |
匹配字母,数字,下划线 |
'python\n123' |
p,y,t,h,o,n,1,2,3 |
| \W |
匹配非字母,数字,下划线 |
'python\n123' |
\n |
| \s |
匹配任意空白字符 |
'python\t123' |
\t |
| \S |
匹配任意非空白字符 |
'python\t123' |
p,y,t,h,o,n,1,2,3 |
| \d |
匹配任意十进制数 |
'python\t123' |
1,2,3 |
限定符(用于限定匹配的次数)
| 限定符 |
描述说明 |
举例 |
结果 |
| ? |
匹配前面的字符0次或一次 |
colou?r |
可以匹配color或colour |
| + |
匹配前面的字符1次或多次 |
colou+r |
可以匹配colour或colouu......r |
| * |
匹配前面的字符0次或多次 |
colou*r |
可以匹配到color或colouu......r |
| {n} |
匹配前面的字符n次 |
colou{2}r |
可以匹配colouur |
| {n,} |
匹配前面的字符最少n次 |
colou{2,}r |
可以匹配colouur或colouuu......r |
| {n,m} |
匹配前面的字符最小n次,最多m次 |
colou{2,4}r |
可以匹配colouur或colouuur或colouuuur |
其他字符
| 其他字符 |
描述说明 |
举例 |
结果 |
| 区间字符 |
匹配 中所指定的字符 |
.?!,0-9 |
匹配的标点符号为点,问号,感叹号,匹配0,1,2,3,4,5,6,7,8,9 |
| 排除字符^ |
匹配不在 中指定的字符 |
尖括号(\^)0-9 |
匹配0,1,2,3,4,5,6,7,8,9 |
| 选择字符1(竖线) |
用于匹配1左右的任意字符 |
\d{18}1\d{15} |
匹配15或18位身份证 |
| 转义字符 |
同python中的转义字符 |
. |
.作为普通字符使用 |
| \\u4e00-\\u9fa5 |
匹配任意一个汉字 |
|
|
| 分组() |
改变限定符的作用 |
six1fourth和(six1four)th |
匹配six或fourth和匹配sixth或fourth |
re模块
| 函数 |
功能描述 |
| re.match(pattern,string,flags=0) |
用于从字符串的开始位置进行匹配,如果起始位置匹配成功,结果为Match对象,否则结果位None。 |
| re.search(pattern,string,flags=0) |
用于在整个字符串中搜索第一个匹配的值,如果匹配成功,结果为Match对象,否则结果位None。 |
| re.findall(pattern,string,flags=0) |
用于在整个字符串搜索所有符合正则表达式的值,结果是一个列表类型 |
| re.sub(pattern,repl,string,count,flags=0) |
用于实现对字符串中指定的子串的替换 |
| re.split(pattern,string,maxsplit,flags=0 |
字符串中split()方法功能相同,都是分隔字符串 |
re.match
import re#导入
pattern='\d\.\d+'#0-9 +是限定符,+ 0-9出现一次或多次
s='I study Python 3.10 '#待匹配字符串
match=re.match(pattern,s,re.I)#re.I忽略大小写
print(match)#因为match是从头开始匹配的,匹配到第一个,显然不是,所以直接none
s2='3.10 Python I study it'
match2=re.match(pattern,s2,re.I)
print(match2)
print('匹配值的起始位置:',match2.start())
print('匹配值的结束位置:',match2.end())
print('匹配区间的位置元素:',match2.span())
print('待匹配的字符串::',match2.string)
print('匹配的数据:',match2.group())
输出结果:
None
<re.Match object; span=(0, 4), match='3.10'>
匹配值的起始位置: 0
匹配值的结束位置: 4
匹配区间的位置元素: (0, 4)
待匹配的字符串:: 3.10 Python I study it
匹配的数据: 3.10
re.search
import re#导入
pattern='\d\.\d+'(#0-9 +是限定符,+ 0-9出现一次或多次)这是规则pattern
s='I study Python 3.10 but i love 2.90 '#待匹配字符串
match=re.search(pattern,s,re.I)#re.I忽略大小写,search是在整个字符串中查找,找到第一个就直接输出,剩下的都不管
print(match)#如果没找到就输出none
print(match.group())
输出结果:
<re.Match object; span=(15, 19), match='3.10'>
3.10
re.findall
import re#导入
pattern='\d\.\d+'#0-9 +是限定符,+ 0-9出现一次或多次
s='I study Python 3.10 but i love 2.90 '#待匹配字符串
list=re.findall(pattern,s,re.I)#re.I忽略大小写,findall是在整个字符串中查找,找到所有的符合值,然后以列表的方式输出
print(list)
输出结果:
['3.10', '2.90']
re.sub
import re#导入
pattern='唱|跳'
s='喜欢唱歌和跳舞'#待匹配字符串
new_s=re.sub(pattern,'?',s)#用问号代替一些不想出现的词汇
print(new_s)
输出结果:
喜欢?歌和?舞
re.split
import re#导入
pattern='[#|?]'
s='https://i.csdn.net/#/user-center/profile?spm=1001.2014.3001.5516'#待匹配字符串
new_s=re.split(pattern,s)#分割
print(new_s)
输出结果:
['https://i.csdn.net/', '/user-center/profile', 'spm=1001.2014.3001.5516']
练习1:使用列表存储一些车牌号,然后用遍历和切片操作判断车牌的归属地
car_number=['京123456','陕456789','津159753']
for item in car_number:
car_address=item[0:1]
print(item,'归属于地',car_address)
输出结果:
京123456 归属于地 京
陕456789 归属于地 陕
津159753 归属于地 津
练习2:统计字符串种字符出现的次数(不区分大小写)
s='HelloPython,HelloWorld,helloEveryone'
s=s.lower()
a=input('请输入要统计的字符(不区分大小写):')
count=s.count(a)
print(f'字符"{a}"在字符串中出现的次数为:{count}')
输出结果:
请输入要统计的字符(不区分大小写):h
字符"h"在字符串中出现的次数为:4
练习3:给一个列表,格式化字符串
lst=[
['01','洗衣机','美的',500],
['02','手机','我的',3000],
['01','电脑','他的',4500]
]
print('编号\t\t名称\t\t谁的\t\t价格')
for item in lst:
for i in item:
print(i,'\t\t',end='')
print()
#格式化操作
print('编号\t\t名称\t\t谁的\t\t价格')
for item in lst:
item[0]='0000'+item[0]
item[3]='¥{0:.2f}'.format(item[3])
for i in item:
print(i,'\t\t',end='')
print()
输出结果:
编号 名称 谁的 价格
01 洗衣机 美的 500
02 手机 我的 3000
01 电脑 他的 4500
编号 名称 谁的 价格
000001 洗衣机 美的 ¥500.00
000002 手机 我的 ¥3000.00
000001 电脑 他的 ¥4500.00