目录

1、使用match()方法进行匹配

2、使用search()方法进行匹配

3、使用findall()方法进行匹配


匹配字符串可以使用re模块提供的match()、search()和findall()等方法。下面分别进行介绍。

1、使用match()方法进行匹配

match()方法用于从字符串的开始处进行匹配,如果在起始位置匹配成功,则返回Match对象,否则返回None。其语法格式如下:

re.match(pattern, string, [flags])

其中,相关参数说明如下:

pattern:表示模式字符串,由要匹配的正则表达式转换而来。

string:表示要匹配的字符串。

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。

常用的标志位及其说明:

re.A或ASCII  对于\w、\w、\b、\B、\d、\B、\d、\D、]s、\S进行ASCII匹配(仅适用于Python3)

re.I或IGNORECASE 使匹配对大小写不敏感

re.L 做本地化识别(locale-aware)匹配

re.M或MULTILINE 多行匹配,影响 ^ 和 $

re.S或DOTALL 使 . 匹配包括换行在内的所有字符

re.U或UNICODE 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.

re.X或VERBOSE 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

例如,匹配字符串是否以“zz_”开头,不区分字母大小写,代码如下:

import re
pattern = r'zz_\w+'                    # 模式字符串
string = 'ZZ_MALL zz_mall'             # 要匹配的字符串
match = re.match(pattern,string,re.I)  # 匹配字符串,不区分大小写
print(match)                           # 输出匹配结果
string = '项目名称 ZZ_MALL zz_mall'    # 要匹配的字符串
match = re.match(pattern,string,re.I)  # 匹配字符串,不区分大小写
print(match)                           # 输出匹配结果

运行结果如下:

<re.Match object; span=(0, 7), match='ZZ_MALL'>
None
>>>

从上面的执行结果中可以看出,字符串“ZZ_MALL”是以“zz_”开头,所以返回一个Match对象,而字符串“项目名称 ZZ_MALL zz_mall”不是以“zz_”开头,所以返回None。这是因为match()方法从字符串的开始位置开始匹配,当第一个字母不符合条件时,则不再进行匹配,直接返回None。

Match对象中包含了匹配值的位置和匹配数据。其中,要获取匹配值的起始位置可以使用Match对象的start()方法;要获取匹配值的结束位置可以使用end()方法;通过span()方法可以返回匹配位置的元组;通过string属性可以获取要匹配的字符串。例如下面的代码:

import re
pattern = r'zz_\w+'                    # 模式字符串
string = 'ZZ_MALL zz_mall'             # 要匹配的字符串
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)
要匹配的字符串:  ZZ_MALL zz_mall
匹配数据:  ZZ_MALL
>>>

下面实例,讲解一个判定的手机号码是不是有效的中国移动的号码。

import re                                       # 导入Python的re模块
pattern = r'(13[4-9]\d{8})|(15[01289]\d{8})$'
mobile = '13800000000'
match = re.match(pattern,mobile)                # 进行模式匹配
if match == None:                               # 判断是否为None,为真表示匹配失败
    print(mobile,'不是有效的中国移动手机号码。')
else:
    print(mobile,'是有效的中国移动手机号码。')
mobile = '13100000000'
match = re.match(pattern,mobile)                # 进行模式匹配
if match == None:                               # 判断是否为None,为真表示匹配失败
    print(mobile,'不是有效的中国移动手机号码。')
else:
    print(mobile,'是有效的中国移动手机号码。')

运行结果如下:

13800000000 是有效的中国移动手机号码。
13100000000 不是有效的中国移动手机号码。
>>>

2、使用search()方法进行匹配

search()方法用于在整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,则返回Match对象,否则返回None。其语法格式如下:

re.search(pattern, string, [flags])

其中,相关参数说明如下:

pattern:表示模式字符串,由要匹配的正则表达式转换而来。

string:表示要匹配的字符串。

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志前面说了。

例如,搜索第一个以“zz_”开头的字符串,不区分字母大小写,代码如下:

import re
pattern = r'zz_\w+'                    # 模式字符串
string = 'ZZ_MALL zz_mall'             # 要匹配的字符串
match = re.search(pattern,string,re.I) # 匹配字符串,不区分大小写
print(match)                           # 输出匹配结果
string = '项目名称 ZZ_MALL zz_mall'    # 要匹配的字符串
match = re.search(pattern,string,re.I) # 匹配字符串,不区分大小写
print(match)                           # 输出匹配结果

运行结果如下:

<re.Match object; span=(0, 7), match='ZZ_MALL'>
<re.Match object; span=(5, 12), match='ZZ_MALL'>
>>>

3、使用findall()方法进行匹配

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

re.findall(pattern, string, [flags])

其中,相关参数说明如下:

pattern:表示模式字符串,由要匹配的正则表达式转换而来。

string:表示要匹配的字符串。

flags:可选参数,表示标志位,用于控制匹配方式,如是否区分字母大小写。常用的标志上面有了。

例如,搜索以“zz_”开头的字符串,不区分字母大小写,代码如下:

import re
pattern = r'zz_\w+'                    # 模式字符串
string = 'ZZ_MALL zz_mall'             # 要匹配的字符串
match = re.findall(pattern,string,re.I)# 匹配字符串,不区分大小写
print(match)                           # 输出匹配结果
string = '项目名称 ZZ_MALL zz_mall'    # 要匹配的字符串
match = re.findall(pattern,string)     # 匹配字符串,区分大小写
print(match)                           # 输出匹配结果

运行结果为:

['ZZ_MALL', 'zz_mall']
['zz_mall']
>>>

上方下面这个结果只有一个,因为我使用了默认的设置,进行区分大小写了。

到此为止,本文学习的是《在Python中匹配字符串的3个方法详解》。本知识点主要内容有:使用match()方法进行匹配、使用search()方法进行匹配、使用findall()方法进行匹配。就讲解完毕了,有问题可以给我留言哦!

下一个知识点,我们讲解《在Python中替换字符串详解》。