正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,它允许用户使用一种特定的语法来描述、匹配和操作文本字符串。正则表达式在编程、文本编辑、数据验证等领域有着广泛的应用。本文将带您深入了解正则表达式的基本概念、常用语法、高级技巧以及实战案例,帮助您轻松掌握模式字符串匹配技巧。

正则表达式基础

什么是正则表达式?

正则表达式是一种用于描述字符组合的模式,它可以用来搜索、匹配和替换文本。正则表达式由普通字符(如字母和数字)和特殊字符(如点号、星号、方括号等)组成。

正则表达式的组成

正则表达式由以下几个部分组成:

  • 普通字符:代表实际字符。
  • 特殊字符:具有特殊意义的字符,如点号(.)、星号(*)、加号(+)等。
  • 字符集合:使用方括号([])定义,用于匹配方括号内的任意一个字符。
  • 量词:用于指定匹配的次数,如星号(*)表示匹配零次或多次。
  • 分组:使用圆括号(())定义,用于匹配括号内的子表达式。

正则表达式的执行过程

  1. 预编译:将正则表达式编译成内部格式。
  2. 匹配:使用编译后的正则表达式在文本中搜索匹配项。
  3. 返回:返回匹配的结果,包括匹配项和位置信息。

常用正则表达式元字符

点号(.)

点号(.)用于匹配除换行符以外的任意单个字符。

import re

text = "Hello, World!"
pattern = "H.llo"
match = re.match(pattern, text)
print(match.group())  # 输出: Hello

星号(*)

星号(*)表示匹配前面的子表达式零次或多次。

text = "aabbcc"
pattern = "a*b"
match = re.match(pattern, text)
print(match.group())  # 输出: ab

加号(+)

加号(+)表示匹配前面的子表达式一次或多次。

text = "aaabbc"
pattern = "a+b"
match = re.match(pattern, text)
print(match.group())  # 输出: aab

问号(?)

问号(?)表示匹配前面的子表达式零次或一次。

text = "aabbcc"
pattern = "a?b"
match = re.match(pattern, text)
print(match.group())  # 输出: ab

花括号({})

花括号({})用于指定匹配的次数。

text = "12345"
pattern = "\d{2,4}"
match = re.match(pattern, text)
print(match.group())  # 输出: 1234

方括号([])

方括号([])用于定义一个字符集合,匹配方括号内的任意一个字符。

text = "a1b2c3"
pattern = "[abc]\d"
match = re.match(pattern, text)
print(match.group())  # 输出: a1

脱字符(^)

脱字符(^)用于指定匹配的起始位置。

text = "abc123"
pattern = "^abc"
match = re.match(pattern, text)
print(match.group())  # 输出: abc

美元符号($)

美元符号($)用于指定匹配的结束位置。

text = "abc123"
pattern = "123$"
match = re.match(pattern, text)
print(match.group())  # 输出: 123

高级正则表达式技巧

捕获组

捕获组用于提取匹配项中的特定部分。

text = "The email is: example@example.com"
pattern = r"(?P<email>\S+@\S+)\b"
match = re.match(pattern, text)
print(match.group("email"))  # 输出: example@example.com

反向引用

反向引用用于引用之前匹配的子表达式。

text = "I have 2 apples and 3 bananas."
pattern = r"(\d+) apples and (\d+) bananas"
match = re.match(pattern, text)
print(match.group(1))  # 输出: 2
print(match.group(2))  # 输出: 3

非捕获组

非捕获组用于匹配但不保存匹配项。

text = "The email is: example@example.com"
pattern = r"(?:(?P<email>\S+@\S+)\b)"
match = re.match(pattern, text)
print(match.group("email"))  # 输出: example@example.com

前瞻断言与后瞻断言

前瞻断言和后瞻断言用于指定匹配条件,而不保存匹配项。

text = "The price is 100 dollars."
pattern = r"The price is (?=\d+ dollars)"
match = re.match(pattern, text)
print(match.group())  # 输出: The price is

贪婪与非贪婪模式

贪婪模式默认匹配尽可能多的字符,而非贪婪模式匹配尽可能少的字符。

text = "The price is 100 dollars."
pattern = r"The price is (\d+) dollars"
match = re.match(pattern, text)
print(match.group(1))  # 输出: 100

pattern = r"The price is (\d+?) dollars"
match = re.match(pattern, text)
print(match.group(1))  # 输出: 100

实战案例

电子邮件地址验证

text = "Please send the document to example@example.com"
pattern = r"\S+@\S+\.\S+"
matches = re.findall(pattern, text)
print(matches)  # 输出: ['example@example.com']

电话号码提取

text = "The phone number is 123-456-7890"
pattern = r"\d{3}-\d{3}-\d{4}"
matches = re.findall(pattern, text)
print(matches)  # 输出: ['123-456-7890']

HTML标签清理

text = "<div>Some <b>bold</b> text.</div>"
pattern = r"<[^>]*>"
clean_text = re.sub(pattern, "", text)
print(clean_text)  # 输出: Some bold text.

总结与拓展

正则表达式是一种强大的文本处理工具,它可以帮助我们轻松地匹配、查找、替换和操作文本字符串。通过本文的学习,您应该已经掌握了正则表达式的基本概念、常用语法、高级技巧以及实战案例。希望您能将所学知识应用到实际项目中,提高文本处理的效率。