正则表达式是一种强大的字符串匹配工具,可以用来查找、替换文本中的特定模式,以及验证输入是否符合特定模式等等。Python提供了re模块来处理正则表达式,该模块包含了多个不同的正则表达式语法,以适应不同的匹配需求。
一、基本的正则表达式语法
正则表达式的语法由普通字符和特殊字符组成,其中特殊字符具有特殊的含义和功能。在Python中,我们可以使用r前缀来将普通字符串转换成原始字符串,以避免某些字符在正则表达式中的特殊处理。下面是一些常见的正则表达式语法:
^ 匹配字符串的开头
$ 匹配字符串的结尾
. 匹配任意字符
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
\ 转义特殊字符
[] 匹配指定范围内的字符
例如,我们可以使用正则表达式来匹配一个字符串是否以数字开头,如下面的代码所示:
import re
pattern = r'^\d+.*'
string = '123 Python'
match = re.match(pattern, string)
if match:
print('匹配成功!')
else:
print('匹配失败!')
输出结果为:
匹配成功!
二、分组和捕获
在正则表达式中,我们可以使用括号来将一部分模式分组,并且这些分组还可以被捕获并供后续处理使用。Python中的re模块提供了group()和groups()方法来获取正则表达式中匹配的分组和捕获的值。 我们可以使用括号分组来匹配一个字符串是否遵循日期格式(如yyyy-mm-dd),并且获取其中的年、月、日信息,如下面的代码所示:
import re
pattern = r'(\d{4})-(\d{2})-(\d{2})'
string = 'Today is 2022-12-08.'
match = re.search(pattern, string)
if match:
print(match.group())
print(match.groups())
else:
print('匹配失败!')
输出结果为:
2022-12-08
('2022', '12', '08')
三、名称分组
名称分组是一种更加便捷、易读的分组方式。它允许我们使用名称来指代某个分组,从而降低了代码的可读性和可维护性难度。在Python中,我们可以使用(?P
...)语法来指定名称分组,使用group()和groupdict()方法来获取分组和名称信息。 例如,我们可以使用名称分组来匹配一个字符串是否遵循实数(即带有小数点)格式,并且获取其中整数和小数部分,如下面的代码所示:
import re
pattern = r'(?P\d+)\.(?P
\d+)'
string = 'The number is 3.14159.'
match = re.search(pattern, string)
if match:
print(match.group())
print(match.group('int'))
print(match.group('decimal'))
print(match.groupdict())
else:
print('匹配失败!')
输出结果为:
3.14159
3
14159
{'int': '3', 'decimal': '14159'}
四、零宽断言
零宽断言是一种查找某些模式的技术,它不会返回实际的匹配文本,而是返回不包含它的上下文。在Python中,我们可以使用(?=...)和(?<=...)语法来实现零宽断言,其中?=表示正向先行断言,?=表示正向后顾断言。 例如,我们可以使用正向后顾断言来匹配一个字符串是否遵循货币格式(即"$XXX.XX"),如下面的代码所示:
import re
pattern = r'(?<=\$)\d+\.\d{2}'
string = 'The price is $3.14.'
match = re.search(pattern, string)
if match:
print(match.group())
else:
print('匹配失败!')
输出结果为:
3.14
五、贪婪和非贪婪
贪婪和非贪婪是正则表达式中常见的概念,它们用于描述匹配模式是否尽量匹配更多的文本(贪婪)或尽量匹配更少的文本(非贪婪)。在Python中,我们可以使用?符号来表示一个模式是非贪婪的。 例如,我们可以使用贪婪模式和非贪婪模式来匹配一个字符串中的多个重复子串,如下面的代码所示:
import re
pattern1 = r'(a.*)+'
pattern2 = r'(a.*?)+' # 非贪婪模式
string = 'aaabbb'
match1 = re.match(pattern1, string)
match2 = re.match(pattern2, string)
if match1:
print(match1.group())
else:
print('贪婪模式匹配失败!')
if match2:
print(match2.group())
else:
print('非贪婪模式匹配失败!')
输出结果为:
aaabbb
aaa
六、总结
本文介绍了Python中的多种正则表达式语法,包括基本的语法、分组和捕获、名称分组、零宽断言、贪婪和非贪婪模式等等。这些语法可以用来处理各种各样的字符串匹配需求,开发者可以根据实际情况灵活选用。