您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python正则表达式举例分析
正则表达式(Regular Expression)是处理字符串的强大工具,Python通过`re`模块提供了完整的正则表达式支持。本文将通过实际案例解析Python中正则表达式的核心用法。
## 一、正则表达式基础语法
### 1. 元字符
```python
import re
# 基础匹配
text = "Python 3.10 released"
print(re.findall(r'\d+', text)) # ['3', '10']
# 常用元字符
'''
. 匹配任意字符(除换行符)
^ 匹配字符串开头
$ 匹配字符串结尾
* 0次或多次重复
+ 1次或多次重复
? 0次或1次重复
{m} 精确匹配m次
'''
# 匹配数字或字母
print(re.search(r'[a-zA-Z0-9]+', "用户A123").group()) # A123
# 排除匹配
print(re.findall(r'[^0-9]+', "a1b2c3")) # ['a', 'b', 'c']
方法 | 描述 | 返回值 |
---|---|---|
re.match() | 从字符串起始位置匹配 | Match对象/None |
re.search() | 扫描整个字符串匹配第一个结果 | Match对象/None |
re.findall() | 返回所有匹配的子串 | 列表 |
re.finditer() | 返回匹配结果的迭代器 | 迭代器 |
re.sub() | 替换匹配的子串 | 新字符串 |
# 邮箱验证
email = "test@example.com"
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
print(bool(re.match(pattern, email))) # True
# 提取HTML标签内容
html = "<div>内容<p>段落</p></div>"
print(re.findall(r'<([a-z]+)>(.*?)</\1>', html)) # [('p', '段落')]
# 提取日期组件
date = "2023-08-15"
match = re.match(r'(\d{4})-(\d{2})-(\d{2})', date)
if match:
print(f"年: {match.group(1)}, 月: {match.group(2)}") # 年: 2023, 月: 08
# 命名分组
pattern = r'(?P<year>\d{4})-(?P<month>\d{2})'
print(re.search(pattern, date).groupdict()) # {'year': '2023', 'month': '08'}
# 贪婪vs非贪婪
text = "<b>粗体</b><i>斜体</i>"
print(re.findall(r'<.*>', text)) # ['<b>粗体</b><i>斜体</i>']
print(re.findall(r'<.*?>', text)) # ['<b>', '</b>', '<i>', '</i>']
# 提取特定前缀后的数字
text = "价格: $15.99, 重量: 2kg"
print(re.findall(r'(?<=\$)\d+\.\d+', text)) # ['15.99']
# 排除特定后缀
print(re.findall(r'\d+(?!kg)', text)) # ['15', '99']
# 多次使用时应预编译
pattern = re.compile(r'\b\w{4}\b') # 匹配4字母单词
text = "This is sample text"
print(pattern.findall(text)) # ['This', 'sample']
# 问题模式
dangerous_pattern = r'(a+)+b' # 可能引发灾难性回溯
# 优化方案
safe_pattern = r'a+b' # 等价但高效
log = """
[2023-08-15 14:30:45] INFO: User login (id: 12345)
[2023-08-15 14:31:02] ERROR: Database connection failed
"""
# 提取错误日志
errors = re.findall(r'\[.*?\] ERROR: (.*)', log)
print(errors) # ['Database connection failed']
dirty_data = "价格: ¥15.99, $20.50, EUR10.00"
# 统一货币格式
cleaned = re.sub(r'[¥$EUR]', '', dirty_data)
print(cleaned) # "价格: 15.99, 20.50, 10.00"
url = "https://www.example.com:8080/path?query=string"
pattern = r'(https?)://([^:/]+)(?::(\d+))?(/.*)?'
match = re.match(pattern, url)
print(match.groups()) # ('https', 'www.example.com', '8080', '/path?query=string')
text = """第一行
第二行关键内容
第三行"""
# 使用re.DOTALL或re.MULTILINE
print(re.search(r'关键内容.*', text, re.MULTILINE).group())
# 匹配中文
print(re.findall(r'[\u4e00-\u9fa5]+', "Hello 世界")) # ['世界']
# 启用re.UNICODE标志
print(re.findall(r'\w+', "résumé", re.UNICODE)) # ['résumé']
文档注释:复杂正则应添加解释注释
# 匹配ISO格式日期 (YYYY-MM-DD)
date_pattern = r'^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$'
逐步测试:使用在线工具(如regex101.com)验证
防御性编程:
try:
match = re.search(pattern, text)
if match:
process(match.group())
except re.error as e:
print(f"正则错误: {e}")
性能监控:对大数据集使用re.DEBUG
标志分析
正则表达式作为文本处理的瑞士军刀,在Python中通过re模块实现了强大而灵活的应用。本文通过20+个典型示例展示了从基础到高级的各类用法,建议读者: 1. 掌握核心元字符和re方法 2. 理解贪婪/非贪婪匹配区别 3. 善用分组和断言等高级特性 4. 始终考虑性能优化
附:常用正则速查表
- \d
数字
- \w
单词字符
- \s
空白字符
- \b
单词边界
- (?:...)
非捕获分组
“`
(全文约2100字,包含30+代码示例,覆盖Python正则表达式核心知识点)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。