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 repattern = re.compile(r'1[3-9]\d{9}')
text = '我的手机号是13812345678,请联系我。'
match = pattern.search(text)
if match:print(match.group())  # 输出:13812345678
提取电子邮件地址
import repattern = re.compile(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+')
text = '请发送邮件到 example.email@example.com 联系我们。'
emails = pattern.findall(text)
print(emails)  # 输出:['example.email@example.com']
替换文本中的URL
import repattern = 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 repattern = re.compile(r"""\d+     # 匹配一个或多个数字\s      # 匹配一个空白符\w+     # 匹配一个或多个字母或数字
""", re.VERBOSE)
text = '123 abc'
match = pattern.search(text)
if match:print(match.group())  # 输出:123 abc
以上是Python正则表达式的详细讲解。正则表达式在文本处理、数据清洗和数据验证等方面非常有用。通过练习和熟悉各种模式和标志,可以大大提高处理字符串的效率和能力。