Python正则表达式:提取关键信息并输出结果
Python 正则表达式:提取关键信息并输出结果
正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,它允许你使用特定的模式来匹配、搜索和操作字符串。在 Python 中,re
模块提供了对正则表达式的全面支持,使得提取关键信息变得高效且灵活。本文将深入探讨 Python 正则表达式的使用方法,涵盖从基础语法到高级技巧,并辅以丰富的示例,帮助你掌握如何利用正则表达式提取关键信息并输出结果。
一、正则表达式基础
-
字符匹配:
-
.
匹配除换行符以外的任意单个字符。 []
匹配字符集中的任意单个字符,例如[abc]
匹配 a、b 或 c。[^]
匹配不在字符集中的任意单个字符,例如[^abc]
匹配除 a、b、c 以外的任意单个字符。\d
匹配数字,等价于[0-9]
。\D
匹配非数字,等价于[^0-9]
。\w
匹配字母数字和下划线,等价于[a-zA-Z0-9_]
。\W
匹配非字母数字和下划线,等价于[^a-zA-Z0-9_]
。\s
匹配空白字符,包括空格、制表符、换行符等。-
\S
匹配非空白字符。 -
数量词:
-
*
匹配前一个字符 0 次或多次。 +
匹配前一个字符 1 次或多次。?
匹配前一个字符 0 次或 1 次。{m}
匹配前一个字符 m 次。{m,n}
匹配前一个字符 m 到 n 次。-
{m,}
匹配前一个字符至少 m 次。 -
边界匹配:
-
^
匹配字符串的开头。 $
匹配字符串的结尾。\b
匹配单词边界。-
\B
匹配非单词边界。 -
分组和捕获:
-
()
用于分组和捕获匹配的子字符串。 -
(?:)
用于分组但不捕获匹配的子字符串。 -
特殊字符转义:
-
使用
\
转义特殊字符,例如\.
、\*
、\+
等。
二、Python re
模块常用函数
re.compile(pattern)
: 编译正则表达式模式,返回一个正则表达式对象,可以提高匹配效率。re.match(pattern, string)
: 从字符串开头匹配,如果匹配成功则返回匹配对象,否则返回 None。re.search(pattern, string)
: 在字符串中搜索第一个匹配,如果匹配成功则返回匹配对象,否则返回 None。re.findall(pattern, string)
: 返回所有非重叠匹配的列表。re.finditer(pattern, string)
: 返回所有非重叠匹配的迭代器。re.sub(pattern, repl, string)
: 将匹配的子字符串替换为 repl。re.split(pattern, string)
: 使用匹配的子字符串作为分隔符分割字符串。
三、提取关键信息示例
- 提取邮箱地址:
```python
import re
text = "我的邮箱是 [email protected], 他的邮箱是 [email protected]."
pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}\b"
emails = re.findall(pattern, text)
print(emails) # 输出: ['[email protected]', '[email protected]']
```
- 提取 URL:
```python
import re
text = "访问我的网站 https://www.example.com 或 http://example.net."
pattern = r"https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+"
urls = re.findall(pattern, text)
print(urls) # 输出: ['https://www.example.com', 'http://example.net']
```
- 提取日期:
```python
import re
text = "今天是 2023-10-27,明天是 2023-10-28。"
pattern = r"\d{4}-\d{2}-\d{2}"
dates = re.findall(pattern, text)
print(dates) # 输出: ['2023-10-27', '2023-10-28']
```
- 提取特定标签内容:
```python
import re
html = "
这是一个段落。
这是另一个段落。
"
pattern = r"
(.*?)
"
paragraphs = re.findall(pattern, html)
print(paragraphs) # 输出: ['这是一个段落。', '这是另一个段落。']
```
- 使用分组捕获多个信息:
```python
import re
text = "用户 John Doe 的 ID 是 12345。"
pattern = r"用户 (\w+) (\w+) 的 ID 是 (\d+)."
match = re.search(pattern, text)
if match:
first_name = match.group(1)
last_name = match.group(2)
user_id = match.group(3)
print(f"First Name: {first_name}, Last Name: {last_name}, User ID: {user_id}")
# 输出: First Name: John, Last Name: Doe, User ID: 12345
```
四、高级技巧
-
非贪婪匹配: 在数量词后面添加
?
可以实现非贪婪匹配,例如.*?
匹配尽可能少的字符。 -
命名捕获组: 使用
(?P<name>...)
可以给捕获组命名,方便后续访问。 -
预查和后查: 使用
(?=...)
(正向预查)、(?!...)
(负向预查)、(?<=...)
(正向后查) 和(?<!...)
(负向后查) 可以实现更复杂的匹配逻辑。 -
标志:
re
模块提供了一些标志,例如re.IGNORECASE
(忽略大小写)、re.MULTILINE
(多行匹配) 等,可以修改正则表达式的行为。
五、总结
Python 正则表达式是一个强大的工具,可以帮助你高效地提取关键信息。本文介绍了正则表达式的基础语法、re
模块常用函数以及一些高级技巧,并提供了丰富的示例。通过学习和实践,你可以灵活运用正则表达式解决各种文本处理问题。 建议你多练习,并查阅 Python 官方文档以获取更详细的信息。 掌握正则表达式将极大地提高你的编程效率,尤其是在处理文本数据时。 希望本文能帮助你更好地理解和应用 Python 正则表达式。