Python正则表达式re模块核心用法与API详解
本文系统梳理Python中正则表达式模块re的核心用法。详细解析了re.I、re.S等修饰符及^、$、.等基础模式,深入讲解re.compile、re.match、re.search、re.split、re.findall、re.finditer和re.sub等关键函数的参数与返回值特性,结合代码示例说明分组捕获、非贪婪匹配及替换函数的实际应用,帮助开发者高效掌握正则处理技巧。
在编写代码时,正则表达式是处理文本的强力工具,但许多开发者在使用中常感到不够熟练,尤其是长时间未使用后容易遗忘。因此,本文旨在重新梳理并复习Python中正则表达式模块re的具体用法,帮助读者巩固相关知识。
正则修饰符与基础模式解析
鉴于本文侧重于回顾与复习,基础概念将不再赘述,首先从正则表达式中的修饰符及其具体功能开始介绍。
修饰符
• re.I:忽略大小写匹配 • re.L:依据本地化设置进行匹配 • re.M:多行匹配,主要影响^和$锚点 • re.S:使点号(.)能匹配包括换行符在内的所有字符 • re.U:根据Unicode字符集解析字符,影响\w、\W、\b、\B等元字符的行为 • re.X:允许更灵活的格式,使正则表达式更易读和理解
模式
• ^:匹配字符串开头 • $:匹配字符串结尾 • .:匹配除换行符外的任意字符;若指定re.DOTALL标记,则可匹配包括换行符在内的任意字符 • [...]:字符集,匹配方括号内的任一字符,如[amk]匹配a、m或k • [^...]:否定字符集,匹配不在方括号内的字符,如[^amk]匹配除a、m、k外的字符 • re*:匹配0个或多个前面的表达式 • re+:匹配1个或多个前面的表达式 • re?:匹配0个或1个前面的表达式,采用非贪婪模式 • re{n}:精确匹配n个前面的表达式 • re{n,}:匹配大于或等于n个前面的表达式 • re{n,m}:匹配n到m个前面的表达式,采用贪婪模式 • a|b:匹配a或b • (re):对正则表达式分组,并捕获匹配的文本 • (?imx):在括号内启用三种可选标志imx,仅影响括号区域 • (?-imx):在括号内关闭imx可选标志,仅影响括号区域 • (?:re):类似(...)但不创建捕获组 • (?imx:re):在括号内使用imx可选标志 • (?-imx:re):在括号内不使用imx可选标志 • (?#...):注释 • (?=re):前向肯定界定符。若括号内的正则表达式在当前位置成功匹配,则整体匹配成功;否则失败。匹配引擎不会回溯,继续尝试界定符右侧部分 • (?!re):前向否定界定符。与肯定界定符相反,当括号内表达式在当前位置无法匹配成功时,整体匹配成功 • (?>re):独立匹配模式,省去回溯过程 • \w:匹配字母、数字及下划线 • \W:匹配非字母、数字及下划线字符 • \s:匹配任意空白字符,等价于[\t\n\r\f] • \S:匹配任意非空白字符 • \d:匹配任意数字 • \D:匹配任意非数字字符 • \A:匹配字符串开始(与^类似,但不受多行模式影响) • \Z:匹配字符串结束;若存在换行符,仅匹配到换行符前的位置 • \z:严格匹配字符串结束 • \G:匹配最后匹配完成的位置 • \b:匹配单词边界,即单词与空格之间的位置 • \B:匹配非单词边界 • \n \t:分别匹配换行符和制表符 • \1...\9:匹配第n个分组的内容
上述内容是正则表达式中常用的模式,其中绝大部分应当熟记于心,以便在实际开发中快速应用。
re模块核心方法详解
接下来,我们将详细探讨re模块提供的一系列核心方法及其使用场景。
re.compile
该方法用于生成一个正则表达式对象,其第一个参数为正则字符串,第二个参数为修饰符(如re.I、re.S等)。
通过上述方法生成的正则对象具备多种方法,包括match、findall、finditer和search等,具体用法将在后续内容中逐一展开。
re.match
match方法从给定字符串的开头开始尝试匹配,且仅匹配一次。这意味着如果字符串的起始部分与正则表达式的第一个字符不匹配,则直接判定为匹配失败。
该方法的参数包括pattern、string和flags。
• pattern:即正则字符串。若通过re.compile方法生成的正则对象调用match,则无需此参数,因为正则对象本身已代表匹配模式。
• string:目标字符串,即需要进行匹配处理的文本。
• flags:正则修饰符,例如re.I,用于控制匹配行为。
若match匹配失败,返回None;若匹配成功,则返回一个match对象。
match对象包含若干常用方法,如span、group和groups等: • span:返回一个二元组,分别表示匹配字符串在目标字符串中的起始下标和结束下标 • group:接受一个整数参数,参数为0时返回正则匹配的整体字符串,参数为1时返回第一个分组匹配的内容,参数为2时返回第二个分组内容,依此类推 • groups:返回由所有group函数结果组成的元组
re.search:全局单次匹配
re.search
search函数与match函数类似,主要区别在于:match仅在字符串开头尝试匹配一次;而search会在整个目标字符串中尝试匹配一次,一旦找到第一个成功匹配即停止,不再继续后续匹配。
search方法同样返回一个match对象,其用法和属性与match方法返回的结果一致。
re.split:字符串分割与分组保留
re.split
split函数用于分割字符串。其功能是根据匹配的正则表达式对目标字符串进行分割,并返回一个列表。
需要注意的是,如果正则表达式中包含分组(括号),则分组内的字符会保留在结果列表中;而未包含在分组中的字符则不会单独作为列表元素保留。具体含义可通过以下示例理解:
st = 'www.baidu.com www.taobao.com'
result = re.split('bai(du)', st)
print(result)
结果:
['www.', 'du', '.com www.taobao.com']
从结果可见,字符串‘du'被括号包围,因此在结果列表中保留了‘du'这一元素;而‘bai'未被括号包围,故在结果列表中不单独出现。
re.findall与re.finditer:获取所有匹配结果
re.findall
该函数是爬虫项目中使用频率极高的方法,它能将所有匹配的结果以列表形式返回,而非像match和search那样仅返回第一个匹配结果。具体用法如下:
st = 'www.baidu.com www.taobao.com'
result = re.findall(r'www\.(\w*)\.(com)', st)
print(result)
[('baidu', 'com'), ('taobao', 'com')]
re.finditer
此函数功能与findall相似,不同之处在于它返回的是一个生成器,生成器中的每一项均为一个match对象。具体示例如下:
st = 'www.baidu.com www.taobao.com'
result = re.finditer(r'www\.(\w*)\.(com)', st)
print(result.__next__().group(0, 1, 2))
print(next(result).groups(2))
('www.baidu.com', 'baidu', 'com')
('taobao', 'com')
re.sub
re.sub:字符串替换与函数回调
该函数用于字符串替换,可将匹配到的字符串替换为指定的字符串。具体用法如下:
st = 'www.111.com www.222.com'
result = re.sub(r'\d+', 'OK', st)
print(result)
结果:
www.OK.com www.OK.com
替换函数的第二个参数除了可以是固定字符串外,还可以是一个函数。具体示例如下:
def toOK(matched):
value = matched.group()
return str(int(value)*2)
st = 'www.111.com www.222.com'
result = re.sub(r'\d+', toOK, st)
print(result)
结果:
www.222.com www.444.com
总结
以上介绍了Python中正则表达式模块re的核心用法,希望能为读者提供实际帮助。如有任何疑问,欢迎留言交流,小编将及时回复。感谢大家对本站的支持! 若本文对您有所帮助,欢迎转载,请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









