自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
Python提供了re模块,用于实现正则表达式的操作。在实现时,可以使用re模块提供的方法(如search()、match()、findall()等)进行字符串处理,也可以先使用re模块的compile()方法将模式字符串转换为正则表达式对象,然后再使用该正则表达式对象的相关方法来操作字符串。
re模块在使用时,需要先应用import语句引入,具体代码如下:
import re
如果在使用re模块时,没有将其引入,将抛出如图21所示的异常。
图21 未引入re模块异常
匹配字符串可以使用re模块提供的match()、search()和findall()等方法。
(1)使用match()方法进行匹配
match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None。其语法格式如下:
re.match(pattern, string, [flags])
参数说明:
l pattern:表示模式字符串,由要匹配的正则表达式转换而来。
l string:表示要匹配的字符串。
l flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如表5所示。
表5 常用标志
标 志 | 说 明 |
A或ASCII | 对于\w、\W、\b、\B、\d、\D、\s和\S只进行ASCII匹配(仅适用于Python 3.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) # 输出匹配结果
执行结果如下:
<_sre.SRE_Match object; span=(0, 7), match='MR_SHOP'>
None
从上面的执行结果中可以看出,字符串“MR_SHOP”以“mr_”开头,将返回一个Match对象,而字符串“项目名称MR_SHOP”没有以“mr_”开头,将返回“None”。这是因为match()方法从字符串的开始位置开始匹配,当第一个字母不符合条件时,则不再进行匹配,直接返回None。
Match对象中包含了匹配值的位置和匹配数据。其中,要获取匹配值的起始位置可以使用Match对象的start()方法;要获取匹配值的结束位置可以使用end()方法;通过span()方法可以返回匹配位置的元组;通过string属性可以获取要匹配的字符串。例如下面的代码:
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())
执行结果如下:
匹配值的起始位置: 0
匹配值的结束位置: 7
匹配位置的元组: (0, 7)
要匹配字符串: MR_SHOP mr_shop
匹配数据: MR_SHOP
实例07 验证输入的手机号码是否为中国移动的号码
在IDLE中创建一个名称为checkmobile.py的文件,然后在该文件中导入Python的re模块,再定义一个验证手机号码的模式字符串,最后应用该模式字符串验证两个手机号码,并输出验证结果,代码如下:
import re # 导入Python的re模块
pattern = r'(13[4-9]\d{8})$|(15[01289]\d{8})$'
mobile = '13634222222'
match = re.match(pattern, mobile) # 进行模式匹配
if match == None: # 判断是否为None,为真表示匹配失败
print(mobile, '不是有效的中国移动手机号码。')
else:
print(mobile, '是有效的中国移动手机号码。')
mobile = '13144222221'
match = re.match(pattern, mobile) # 进行模式匹配
if match == None: # 判断是否为None,为真表示匹配失败
print(mobile, '不是有效的中国移动手机号码。')
else:
print(mobile, '是有效的中国移动手机号码。')
运行实例,将显示如图22所示的结果。
图22 验证输入的手机号码是否为中国移动的号码
(2)使用search()方法进行匹配
search()方法用于在整个字符串中搜索第一个匹配的值,如果匹配成功,则返回Match对象,否则返回None。search()方法的语法格式如下:
re.search(pattern, string, [flags])
参数说明:
l pattern:表示模式字符串,由要匹配的正则表达式转换而来。
l string:表示要匹配的字符串。
l flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如表5所示。
例如,搜索第一个以“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) # 输出匹配结果
执行结果如下:
<_sre.SRE_Match object; span=(0, 7), match='MR_SHOP'>
<_sre.SRE_Match object; span=(4, 11), match='MR_SHOP'>
从上面的运行结果中可以看出,search()方法不仅仅是在字符串的起始位置搜索,其他位置有符合的匹配也可以进行搜索。
实例08 验证是否出现危险字符
在IDLE中创建一个名称为checktnt.py的文件,然后在该文件中导入Python的re模块,再定义一个验证危险字符的模式字符串,最后应用该模式字符串验证两段文字,并输出验证结果,代码如下:
import re # 导入Python的re模块
pattern = r'(黑客)|(抓包)|(监听)|(Trojan)' # 模式字符串
about = '我是一名程序员,我喜欢看黑客方面的图书,想研究一下Trojan。'
match = re.search(pattern, about) # 进行模式匹配
if match == None: # 判断是否为None,为真表示匹配失败
print(about, '@ 安全!')
else:
print(about, '@ 出现了危险词汇!')
about = '我是一名程序员,我喜欢看计算机网络方面的图书,喜欢开发网站。'
match = re.match(pattern, about) # 进行模式匹配
if match == None: # 判断是否为None,为真表示匹配失败
print(about, '@ 安全!')
else:
print(about, '@ 出现了危险词汇!')
运行实例,将显示如图23所示的结果。
图23 验证是否出现危险字符
(3)使用findall()方法进行匹配
findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串,并以列表的形式返回。如果匹配成功,则返回包含匹配结构的列表,否则返回空列表。findall()方法的语法格式如下:
re.findall(pattern, string, [flags])
参数说明:
l pattern:表示模式字符串,由要匹配的正则表达式转换而来。
l string:表示要匹配的字符串。
l flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志如表5所示。
例如,搜索以“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) # 输出匹配结果
执行结果如下:
['MR_SHOP', 'mr_shop']
['mr_shop']
如果在指定的模式字符串中,包含分组,则返回与分组匹配的文本列表。例如,
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) # 进行模式匹配
print(match)
上面代码的执行结果如下:
['.1', '.66']
从上面的结果中可以看出,并没有得到匹配的IP地址,这是因为在模式字符串中出现了分组,所以得到的结果是根据分组进行匹配的结果,即“(\.[0-9]{1,3})”匹配的结果。如果想获取整个模式字符串的匹配,可以将整个模式字符串使用一对小括号进行分组,然后在获取结果时,只取返回值列表的每个元素(是一个元组)的第1个元素。代码如下:
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 item in match:
print(item[0])
执行结果如下:
127.0.0.1
192.168.1.66