Python中的正则表达式(regular expressions,简称regex)是强大的字符串处理工具,用于搜索、匹配和替换字符串中的特定模式。Python通过 re
模块提供对正则表达式的支持。以下是对Python正则表达式的详细讲解。
基本概念和语法
导入模块
import re
基本函数
re.match(pattern, string)
: 从字符串的起始位置匹配模式。re.search(pattern, string)
: 搜索整个字符串,返回第一个匹配的对象。re.findall(pattern, string)
: 返回字符串中所有非重叠匹配的列表。re.finditer(pattern, string)
: 返回字符串中所有非重叠匹配的迭代器。re.sub(pattern, repl, string)
: 替换字符串中所有匹配的子串。
编译模式
可以通过 re.compile()
预编译正则表达式模式,提高匹配效率:
pattern = re.compile(r'\d+')
result = pattern.findall('123 abc 456')
print(result) # ['123', '456']
常用正则表达式符号
字符匹配
.
: 匹配除换行符以外的任意字符。\d
: 匹配任意数字,相当于[0-9]
。\D
: 匹配任意非数字字符。\w
: 匹配字母、数字和下划线,相当于[a-zA-Z0-9_]
。\W
: 匹配任意非字母、数字和下划线的字符。\s
: 匹配空白字符(包括空格、制表符、换页符等)。\S
: 匹配非空白字符。
边界匹配
^
: 匹配字符串的开头。$
: 匹配字符串的结尾。\b
: 匹配单词边界。\B
: 匹配非单词边界。
量词
*
: 匹配前面的字符0次或多次。+
: 匹配前面的字符1次或多次。?
: 匹配前面的字符0次或1次。{n}
: 匹配前面的字符恰好n次。{n,}
: 匹配前面的字符至少n次。{n,m}
: 匹配前面的字符至少n次,至多m次。
分组
(...)
: 匹配括号内的正则表达式,并形成一个组。(?:...)
: 匹配括号内的正则表达式,但不形成组。
特殊转义字符
\\
: 反斜杠,用于转义特殊字符。\n
: 匹配换行符。\t
: 匹配制表符。
示例
匹配手机号
import re
pattern = re.compile(r'1[3-9]\d{9}')
text = '我的手机号是13812345678,请联系我。'
match = pattern.search(text)
if match:
print(match.group()) # 输出:13812345678
提取电子邮件地址
import re
pattern = re.compile(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+')
text = '请发送邮件到 [email protected] 联系我们。'
emails = pattern.findall(text)
print(emails) # 输出:['[email protected]']
替换文本中的URL
import re
pattern = re.compile(r'https?://[^\s]+')
text = '访问我们的官网 http://example.com 或 https://example.org 获取更多信息。'
new_text = pattern.sub('URL', text)
print(new_text) # 输出:访问我们的官网 URL 或 URL 获取更多信息。
正则表达式标志
常用标志
re.IGNORECASE
或re.I
: 忽略大小写。re.MULTILINE
或re.M
: 多行模式,^
和$
匹配每一行的开头和结尾。re.DOTALL
或re.S
: 点号匹配包括换行符在内的任意字符。re.VERBOSE
或re.X
: 允许在正则表达式中使用空白符和注释,以增加可读性。
示例:
import re
pattern = re.compile(r"""
\d+ # 匹配一个或多个数字
\s # 匹配一个空白符
\w+ # 匹配一个或多个字母或数字
""", re.VERBOSE)
text = '123 abc'
match = pattern.search(text)
if match:
print(match.group()) # 输出:123 abc
以上是Python正则表达式的详细讲解。正则表达式在文本处理、数据清洗和数据验证等方面非常有用。通过练习和熟悉各种模式和标志,可以大大提高处理字符串的效率和能力。