Python正则表达式

Python 正则表达式详解

正则表达式是一种强大的文本处理工具,它允许你使用模式来匹配、搜索、替换和操作字符串。在 Python 中,re 模块提供了对正则表达式的全面支持。本文将深入探讨 Python 正则表达式的各个方面,从基础语法到高级用法,帮助你掌握这一强大的工具。

一、基础语法

正则表达式的核心在于其特殊的语法,它使用一系列字符和符号来定义匹配模式。以下是一些常用的元字符及其含义:

  • .: 匹配除换行符以外的任意单个字符。
  • ^: 匹配字符串的开头。
  • $: 匹配字符串的结尾。
  • *: 匹配前面的字符零次或多次。
  • +: 匹配前面的字符一次或多次。
  • ?: 匹配前面的字符零次或一次。
  • {m}: 匹配前面的字符 m 次。
  • {m,n}: 匹配前面的字符至少 m 次,最多 n 次。
  • []: 定义字符集,匹配括号内的任意一个字符。例如 [aeiou] 匹配任意一个元音字母。
  • [^]: 定义反向字符集,匹配不在括号内的任意一个字符。例如 [^aeiou] 匹配任意一个非元音字母。
  • |: 表示或,匹配左右两侧的任意一个表达式。例如 a|b 匹配 a 或 b。
  • (): 定义一个组,可以用于捕获匹配的子字符串或进行反向引用。
  • \: 转义字符,用于匹配特殊字符本身,例如 \. 匹配点号,\* 匹配星号。
  • \d: 匹配数字,等价于 [0-9]
  • \D: 匹配非数字,等价于 [^0-9]
  • \s: 匹配空白字符,包括空格、制表符、换行符等。
  • \S: 匹配非空白字符。
  • \w: 匹配字母数字下划线,等价于 [a-zA-Z0-9_]
  • \W: 匹配非字母数字下划线。
  • \b: 匹配单词边界。
  • \B: 匹配非单词边界。

二、re 模块常用函数

Python 的 re 模块提供了一系列函数用于操作正则表达式:

  • re.compile(pattern, flags=0): 编译正则表达式模式,返回一个正则表达式对象。编译后的正则表达式对象可以提高匹配效率。
  • re.match(pattern, string, flags=0): 从字符串的开头开始匹配,如果匹配成功则返回一个匹配对象,否则返回 None。
  • re.search(pattern, string, flags=0): 在字符串中搜索匹配,如果找到匹配则返回一个匹配对象,否则返回 None。
  • re.findall(pattern, string, flags=0): 返回所有非重叠匹配的列表。
  • re.finditer(pattern, string, flags=0): 返回一个迭代器,迭代所有非重叠匹配的匹配对象。
  • re.sub(pattern, repl, string, count=0, flags=0): 将匹配的子字符串替换为 repl。
  • re.split(pattern, string, maxsplit=0, flags=0): 使用匹配的子字符串作为分隔符分割字符串。

三、匹配对象

当使用 re.match()re.search() 成功匹配时,会返回一个匹配对象。匹配对象包含以下常用方法:

  • group(num=0): 返回匹配的子字符串。num=0 返回整个匹配,num=1 返回第一个组,以此类推。
  • groups(): 返回所有组的元组。
  • start()/end():返回匹配的起始/结束位置。
  • span():返回一个元组,包含匹配的起始和结束位置。

四、编译标志 (flags)

编译标志可以修改正则表达式的匹配行为。一些常用的标志包括:

  • re.IGNORECASE (re.I): 忽略大小写。
  • re.MULTILINE (re.M): 多行模式,^$ 分别匹配每行的开头和结尾。
  • re.DOTALL (re.S): . 匹配包括换行符在内的所有字符。
  • re.ASCII (re.A): 让 \w, \W, \b, \B, \d, \D, \s\S 只匹配 ASCII 字符。
  • re.VERBOSE (re.X): 冗长模式,允许在正则表达式中添加注释和空格,提高可读性。

五、示例

以下是一些 Python 正则表达式的示例:

```python
import re

匹配邮箱地址

pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}"
string = "My email is [email protected] and another email is [email protected]"
matches = re.findall(pattern, string)
print(matches) # Output: ['[email protected]', '[email protected]']

替换字符串

pattern = r"\s+" # 匹配一个或多个空格
string = "This is a string with too many spaces."
new_string = re.sub(pattern, " ", string)
print(new_string) # Output: This is a string with too many spaces.

使用编译标志

pattern = r"^hello"
string = "hello world\nhello python"
matches = re.findall(pattern, string, re.MULTILINE)
print(matches) # Output: ['hello', 'hello']

使用分组捕获

pattern = r"(\d{4})-(\d{2})-(\d{2})"
string = "Date: 2023-10-27"
match = re.search(pattern, string)
if match:
year = match.group(1)
month = match.group(2)
day = match.group(3)
print(f"Year: {year}, Month: {month}, Day: {day}") # Output: Year: 2023, Month: 10, Day: 27

冗长模式示例

pattern = r"""
^ # beginning of string
(\d{4})- # year
(\d{2})- # month
(\d{2}) # day
$ # end of string
"""
string = "2023-10-27"
match = re.match(pattern, string, re.VERBOSE)
if match:
print(match.groups()) # Output: ('2023', '10', '27')
```

六、高级用法

  • 反向引用: 使用 \1, \2 等来引用之前捕获的组。

  • 命名组: 使用 (?P<name>...) 来给组命名,方便访问。

  • 前瞻断言: (?=...) 表示肯定前瞻,(?!...) 表示否定前瞻。

  • 后顾断言: (?<=...) 表示肯定后顾,(?<!...) 表示否定后顾 (Python re 模块只支持固定长度的后顾断言).

七、结语

Python 正则表达式是一个功能强大的工具,可以帮助你高效地处理文本。通过学习和掌握正则表达式的语法和用法,你可以更好地处理各种文本处理任务,从简单的字符串匹配到复杂的文本分析。 希望本文能帮助你全面理解和应用 Python 正则表达式。 记住,实践是掌握正则表达式的关键,多练习才能更加熟练地运用。 此外,在线正则表达式测试工具可以帮助你快速验证和调试你的正则表达式。

THE END