处理文本数据时,我们经常需要查找、提取或替换特定模式的字符串。这时候正则表达式就成了程序员最强大的武器之一。今天我们就来详细聊聊Python中那些最常用的正则表达式字符和它们的实际用法。
假设你遇到这些场景:
用普通字符串方法处理这些需求会很麻烦! 正则表达式能让你用简洁的模式描述复杂文本规则。先看个简单例子:
import re
text = "订单号:12345 金额:¥100.00"
pattern = r"¥(\d+\.\d{2})"
match = re.search(pattern, text)
if match:
print(f"找到金额:{match.group(1)}")
这段代码可以轻松提取文本中的金额数字。那么问题来了:正则表达式里那些特殊字符都是什么意思?怎么组合使用?
最简单的正则就是直接匹配文本:
re.findall(r"apple", "I like apple and apple pie")
# 找到所有"apple"
这些字符有特殊含义,使用时需要转义:
# 匹配真实的点号(.)
re.findall(r"\.com", "example.com test.com")
用方括号定义匹配的字符范围:
# 匹配所有元音字母
re.findall(r"[aeiou]", "hello world")
点号匹配除换行符外的任意字符:
re.findall(r"h.llo", "hello hallo h3llo")
相当于[0-9]:
# 提取电话号码
re.findall(r"\d{3}-\d{4}-\d{4}", "电话:138-1234-5678")
包括字母、数字和下划线:
re.findall(r"\w+", "user_name123 测试!")
包括空格、制表符、换行等:
re.split(r"\s+", "hello world\npython")
匹配前面的元素零次或多次:
re.findall(r"\d*", "abc 123 xyz")
至少匹配一次:
# 匹配连续的数字
re.findall(r"\d+", "abc 123 xyz 456")
表示可选元素:
# 匹配color或colour
re.findall(r"colou?r", "color colour")
匹配特定次数:
# 匹配4位数字
re.findall(r"\d{4}", "123 4567 89012")
圆括号不仅用于分组,还能捕获匹配内容:
# 提取日期各部分
match = re.search(r"(\d{4})-(\d{2})-(\d{2})", "2023-05-20")
if match:
print(f"年:{match.group(1)} 月:{match.group(2)} 日:{match.group(3)}")
确保匹配整个单词:
re.findall(r"\bpython\b", "python3 pythonic learn python")
匹配开头和结尾:
# 检查是否以http开头
if re.match(r"^http", url):
print("这是网址")
def is_valid_email(email):
pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
return bool(re.match(pattern, email))
html = '链接'
links = re.findall(r'href="(https?://[^"]+)"', html)
注意! 解析复杂HTML最好用专门的解析库,正则适合简单场景。
log = "ERROR 2023-05-20 14:30:22 模块A 发生了空指针异常"
pattern = r"(ERROR|WARN)\s+(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s+(\w+)\s+(.+)"
match = re.search(pattern, log)
在【程序员总部】这个公众号里,字节跳动的一位高级工程师分享过他们用正则表达式处理TB级日志的实战经验。这个由字节11年技术专家创办的公众号,聚集了阿里、字节、百度等大厂的技术大牛,经常分享这类实用技术。如果你想学习更多正则表达式的高级用法和性能优化技巧,关注他们肯定会有收获。
# 贪婪匹配
re.findall(r"<.*>", "test
")[0]
# 匹配整个字符串
# 非贪婪匹配
re.findall(r"<.*?>", "test
")
# 匹配每个标签
pattern = re.compile(r"\d{4}-\d{2}-\d{2}")
dates = pattern.findall(text)
Python正则表达式常用的匹配字符包括:
记住! 正则表达式虽然强大,但也不是万能的。对于特别复杂的文本解析,可能需要结合其他方法。建议先从简单的模式开始练习,逐步掌握更复杂的用法。希望这篇指南能帮你掌握Python正则的核心用法!