8.Python中使用正则表达式

本文详细介绍了Python中正则表达式的使用,包括行定位符、元字符、重复、字符类、排除字符、选择字符、转义字符、分组等语法,并讲解了在Python中通过re模块进行字符串匹配、替换和分隔的方法。

8.1正则表达式语法
正则表达式(Regular Expression,常简写为regex或者RE),又称规则表达式。
8.1.1 行定位符
行定位符用来描述字符串的边界,“^”表示行的开始,“”表示行的结尾。例如:tmtm”表示行的结尾。例如: ^tm tmtmtm
8.1.2 元字符
常用元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

8.1.3 重复
限定符:限定数量的字符
限定符 说明
? 匹配前面的字符零次或一次

  •   匹配前面的字符一次或多次
    
  •   匹配前面的字符零次或多次
    

{n} 匹配前面的字符n次
{n,} 匹配前面的字符最少n次
{n,m} 匹配前面的字符最少n次,最多m次

8.1.4 字符类

[aeiou]
[.?!]
[0-9]	\d
[a-z0-9A-Z]		\w

8.1.5 排除字符
匹配不符合指定字符集合的字符串

[^a-zA-Z]

8.1.6 选择字符
匹配身份证号:

(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$

8.1.7 转义字符
IP地址

[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

8.1.8 分组

(thir|four)th
(\.[0-9]{1,3}{3})

8.1.9 在Python中使用正则表达式语法
匹配不是字母的一个字符:

'[^a-zA-Z]'

匹配以字母m开头的单词:

'\\bm\\w*\\b'

模式字符串中可能存在大量的特殊字符和反斜杠,所以需要写为原生字符串,即在模式字符串前加r或R。

r'\bm\w*\b'

8.2 使用re模块实现正则表达式操作
使用re模块前需要先导入re模块

import re

8.2.1 匹配字符串
1.使用match()方法进行匹配
match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None。
re.match(pattern,string,[flags])
pattern:表示模式字符串,由要匹配的正则表达式转换而来。
string:表示要匹配的字符串。
flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如:

标志 说明
A或ASCII 对于\w、\W、\b、\B、\D、\d、\s、\S只进行ASCII匹配(仅适用于Python3.x)
I或IGNORECASE 执行不区分大小写的匹配
M或MULTILINE 将^或$用于包括整个字符串的开始和结尾的每一行(默认情况下,竟是用于整个字符串的开始和结尾处)
S或DOTALL 使用“.”字符匹配所有字符,包括换行符
X或VERBOSE 忽略模式字符串中未转义的空格和注释

#匹配字符串是否以“mr_”开头,不区分字符大小写
import re
pattern=r"mr_\w+"
string="MR_SHOP mr_shop"
match=re.match(pattern,string,re.I)
print(match)
string="项目名称 MR_SHOP mr_shop"
match=re.match(pattern,string,re.I)
print(match)

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.1正则表达式语法.py
<re.Match object; span=(0, 7), match='MR_SHOP'>
None
#match对象的方法
import re
pattern=r"mr_\w+"
string="MR_SHOP 哈哈 mr_shop"
match=re.match(pattern,string,re.I)
print("匹配值的起始位置:",match.start())
print("匹配值的结束位置:",match.end())
print("匹配位置的元组:",match.span())
print("要匹配的字符串:",match.string)
print("匹配数据:",match.group())

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.1匹配字符串.py
匹配值的起始位置: 0
匹配值的结束位置: 7
匹配位置的元组: (0, 7)
要匹配的字符串: MR_SHOP 哈哈 mr_shop
匹配数据: MR_SHOP
#验证输入的手机号码是否合法
import re
pattern=r"(13[4-9]\d{8})$|15[01289]\d{8}$"
while True:
    mobile = input()
    match = re.match(pattern, mobile)
    if match==None:
        print("不是有效的中国移动手机号。")
    else:
        print("是有效的中国移动手机号。")
        break
		
E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2checkmobile.py
546546
不是有效的中国移动手机号。
45864654
不是有效的中国移动手机号。
1501233354
不是有效的中国移动手机号。
15012333541
是有效的中国移动手机号。

2.使用search()方法进行匹配
search()方法用于在整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,则返回Match对象,否则返回None。
re.search(pattern,string,[flags])
pattern:表示模式字符串,由要匹配的正则表达式转换而来。
string:表示要匹配的字符串。
flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

#搜索第一个以“mr_”开头的字符串,不区分字符大小写
import re
pattern=r"mr_\w+"
string="MR_SHOP mr_shop"
match=re.search(pattern,string,re.I)
print(match)
string="项目名称 MR_SHOP mr_shop"
match=re.search(pattern,string,re.I)
print(match)

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.2search()方法.py
<re.Match object; span=(0, 7), match='MR_SHOP'>
<re.Match object; span=(5, 12), match='MR_SHOP'>
#验证是否出现危险字符
import re
pattern=r"(黑客)|(抓包)|(监听)|(Trojan)"
about="我是一名程序员,我喜欢看黑客方面的图书,想研究一下Trojan。"
match=re.search(pattern,about)
if match==None:
    print(about,"@ 安全!")
else:
    print(about,"@ 出现危险词汇!")

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.2checktnt.py
我是一名程序员,我喜欢看黑客方面的图书,想研究一下Trojan。 @ 出现危险词汇!

3.使用findall()方法进行匹配
findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。

re.findall(pattern,string,[flags])
pattern:表示模式字符串,由要匹配的正则表达式转换而来。
string:表示要匹配的字符串。
flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。
#搜索以“mr_”开头的字符串
import re
pattern=r"mr_\w+"
string="MR_SHOP mr_shop"
match=re.findall(pattern,string,re.I)
print(match)
string="项目名称 MR_SHOP mr_shop"
match=re.findall(pattern,string)
print(match)

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.3findall()方法.py
['MR_SHOP', 'mr_shop']
['mr_shop']
#匹配ip
import re
pattern=r"([1-9]{1,3}(.[0-9]{1,3}){3})"
str1="127.0.0.1 192.168.1.66"
match=re.findall(pattern,str1)
for i in match:
    print(i[0])
	
E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.3matchIP.py
127.0.0.1
192.168.1.66

8.2.2 替换字符串
sub()方法用于实现字符串替换。
re.sub(pattern,repl,string,count,flags)
pattern:表示模式字符串,由要匹配的正则表达式转换而来。
repl:表示替换的字符串。
string:表示要匹配的字符串。
sount:可选参数,表示模式匹配后替换的最大次数,默认值为0,表示替换所有的匹配。
flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

#隐藏中奖信息中的手机号码	
import re
pattern=r"1[34578]\d{9}"
string="中奖号码为:84978981 联系电话为:13611111111"
result=re.sub(pattern,'1XXXXXXXXXX',string)
print(result)

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.2替换字符串.py
中奖号码为:84978981 联系电话为:1XXXXXXXXXX
#替换出现的危险字符
import re
pattern=r"(黑客)|(抓包)|(监听)|(Trojan)"
about="我是一名程序员,我喜欢看黑客方面的图书,想研究一下Trojan。"
sub=re.sub(pattern,"@_@",about)
print(sub)

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.2替换出现的危险字符.py
我是一名程序员,我喜欢看@_@方面的图书,想研究一下@_@。

8.2.3 使用正则表达式分隔字符串
split()方法用于实现根据正则表达式分隔字符串,并以列表的形式返回。
re.split(pattern,string,[maxsplit],[flags])
pattern:表示模式字符串,由要匹配的正则表达式转换而来。
string:表示要匹配的字符串。
maxsplit:可选参数,表示最大的拆分次数。
flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

#从给定的URL地址中提取出请求地址和各个参数
import re
pattern=r"[?|&]"
url='http://www.mingrisoft.com/login.jsp?username="mr"&pwd="mrsoft"'
result=re.split(pattern,url)
print(result)

E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.3使用正则表达式分隔字符串.py
['http://www.mingrisoft.com/login.jsp', 'username="mr"', 'pwd="mrsoft"']
#输出被@的好友名称(副本)。
import re
str1='@明白科技 @扎克伯格 @盖茨'
pattern=r'\s*@'
list1=re.split(pattern,str1)
print("您@的好友有:")
for item in list1:
    if item !="":
        print(item)
		
E:\python\venv\Scripts\python.exe E:/python/Python中使用正则表达式/8.2.3使用正则表达式分割字符串.py
您@的好友有:
明白科技
扎克伯格
盖茨
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值