正则表达式(Regular Expressions,简称Regex)是一种用来描述和匹配字符串中字符模式的工具。在Python中,正则表达式是通过re
模块来实现的。无论你是数据分析师、开发者,还是做文本处理的人,正则表达式都能够帮助你高效地完成字符串搜索、替换、分割等操作。
在这篇文章中,我们将从零开始学习Python中的正则表达式,涵盖基础语法、常用功能及示例代码。
正则表达式基础
正则表达式是由一系列字符构成的字符串,用来描述一组字符串的匹配规则。它通常用于查找、替换、匹配字符串中符合某些模式的内容。
1. 基本的正则表达式
Python的re
模块提供了对正则表达式的支持。常见的基本匹配符号包括:
.
:匹配任意一个字符(除了换行符)。^
:匹配字符串的开始。$
:匹配字符串的结束。[]
:表示一个字符集,匹配其中的任何一个字符。|
:表示“或”操作符。\
:用于转义字符。
示例:基础正则表达式
import re
# 示例1:匹配任意字符
pattern = r"^a.c$"
text = "abc"
if re.match(pattern, text):
print(f"'{
text}' 匹配成功!")
else:
print(f"'{
text}' 匹配失败。")
# 示例2:匹配字符集中的任何字符
pattern = r"[aeiou]"
text = "hello"
matches = re.findall(pattern, text)
print(f"匹配到的字符:{
matches}")
输出:
'abc' 匹配成功!
匹配到的字符:['e', 'o']
2. 字符集和范围
字符集用[]
表示,可以指定范围。例如:
[a-z]
:匹配小写字母。[A-Z]
:匹配大写字母。[0-9]
:匹配数字。
示例:使用字符集匹配
import re
pattern = r"[a-z]"
text = "Python123"
matches = re.findall(pattern, text)
print(f"匹配到的小写字母:{
matches}")
输出:
匹配到的小写字母:['y', 't', 'h', 'o', 'n']
3. 特殊字符
\d
:匹配一个数字,等同于[0-9]
。\D
:匹配一个非数字字符,等同于[^0-9]
。\w
:匹配一个字母、数字或下划线,等同于[a-zA-Z0-9_]
。\W
:匹配一个非字母、数字或下划线,等同于[^a-zA-Z0-9_]
。\s
:匹配任何空白字符(包括空格、制表符、换行符等)。\S
:匹配任何非空白字符。
示例:匹配数字
import re
pattern = r"\d"
text = "I have 2 apples and 5 bananas."
matches = re.findall(pattern, text)
print(f"匹配到的数字:{
matches}")
输出:
匹配到的数字:['2', '5']
进阶正则表达式
1. 贪婪匹配与非贪婪匹配
- 贪婪匹配:尽可能多地匹配字符,直到整个模式不再匹配为止。
- 非贪婪匹配:尽可能少地匹配字符。
示例:贪婪匹配与非贪婪匹配
import re
# 贪婪匹配
pattern_greedy = r"<.*>"
text = "<html><body>Hello, World!</body></html>"
result_greedy = re.findall(pattern_greedy, text)
print(f"贪婪匹配结果:{
result_greedy}")
# 非贪婪匹配
pattern_non_greedy = r"<.*?>"
result_non_greedy = re.findall(pattern_non_greedy, text)
print(f"非贪婪匹配结果:{
result_non_greedy}")
输出:
贪婪匹配结果:['<html><body>Hello, World!</body></html>']
非贪婪匹配结果:['<html>', '<body>', '</body>', '</html>']
2. 分组与捕获
分组使用圆括号()
表示,捕获组可以提取匹配的子字符串。
示例:使用分组提取信息
import re
pattern = r"(\d{3})-(\d{2})-(\d{4})"
text = "My SSN is 123-45-6789."
match = re.match(pattern, text)
if match:
print(f"匹配的区域:{
match.groups()}")
输出:
匹配的区域:('123', '45', '6789')
3. 替换
使用re.sub()
方法可以进行字符串替换。
示例:使用re.sub()
进行替换
import re
pattern = r"\d+"
replacement = "#"
text = "My phone number is 12345 and my zip code is 67890."
result = re.sub(pattern, replacement, text)
print(f"替换后的文本:{
result}")
输出:
替换后的文本:My phone number is ##### and my zip code is #####.
4. 查找所有匹配项
使用re.findall()
可以查找所有匹配的项。
示例:查找所有电子邮件地址
import re
pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
text = "Please contact us at [email protected] or [email protected]."
matches = re.findall(pattern, text)
print(f"匹配到的电子邮件地址:{
matches}")
输出:
匹配到的电子邮件地址:['[email protected]', '[email protected]']
常见应用场景
- 验证输入:例如验证电子邮件地址、电话号码等。
- 提取信息:从文本中提取特定格式的数据,如日期、时间、金额等。
- 文本替换:替换文本中的特定内容,如清洗数据、格式化输出等。
- 文本解析:解析HTML、XML或JSON等格式的文本数据。
总结
正则表达式是一个强大而灵活的工具,可以帮助我们高效地处理各种字符串匹配和替换任务。Python的re
模块使得正则表达式在Python中得到了广泛应用,掌握正则表达式的基本语法和常用功能,将极大提升你处理文本的能力。
如果你还对正则表达式有疑问或想深入了解,可以参考官方文档或进一步的学习资源。掌握它,你将成为一个更高效的程序员。