初始Python篇——正则表达式

正则表达式(Regular Expressions,简称Regex)是一种用来描述和匹配字符串中字符模式的工具。在Python中,正则表达式是通过re模块来实现的。无论你是数据分析师、开发者,还是做文本处理的人,正则表达式都能够帮助你高效地完成字符串搜索、替换、分割等操作。

在这篇文章中,我们将从零开始学习Python中的正则表达式,涵盖基础语法、常用功能及示例代码。

正则表达式基础

正则表达式是由一系列字符构成的字符串,用来描述一组字符串的匹配规则。它通常用于查找、替换、匹配字符串中符合某些模式的内容。

1. 基本的正则表达式

Python的re模块提供了对正则表达式的支持。常见的基本匹配符号包括:

  • .:匹配任意一个字符(除了换行符)。
  • ^:匹配字符串的开始。
  • $:匹配字符串的结束。
  • []:表示一个字符集,匹配其中的任何一个字符。
  • |:表示“或”操作符。
  • \:用于转义字符。
示例:基础正则表达式
import re

# 示例1:匹配任意字符
pattern = r"^a.c$"
text = "abc"
if re.match(pattern, text):
    print(f"'{
      
      text}' 匹配成功!")
else:
    print(f"'{
      
      text}' 匹配失败。")

# 示例2:匹配字符集中的任何字符
pattern = r"[aeiou]"
text = "hello"
matches = re.findall(pattern, text)
print(f"匹配到的字符:{
      
      matches}")

输出:

'abc' 匹配成功!
匹配到的字符:['e', 'o']

2. 字符集和范围

字符集用[]表示,可以指定范围。例如:

  • [a-z]:匹配小写字母。
  • [A-Z]:匹配大写字母。
  • [0-9]:匹配数字。
示例:使用字符集匹配
import re

pattern = r"[a-z]"
text = "Python123"
matches = re.findall(pattern, text)
print(f"匹配到的小写字母:{
      
      matches}")

输出:

匹配到的小写字母:['y', 't', 'h', 'o', 'n']

3. 特殊字符

  • \d:匹配一个数字,等同于[0-9]
  • \D:匹配一个非数字字符,等同于[^0-9]
  • \w:匹配一个字母、数字或下划线,等同于[a-zA-Z0-9_]
  • \W:匹配一个非字母、数字或下划线,等同于[^a-zA-Z0-9_]
  • \s:匹配任何空白字符(包括空格、制表符、换行符等)。
  • \S:匹配任何非空白字符。
示例:匹配数字
import re

pattern = r"\d"
text = "I have 2 apples and 5 bananas."
matches = re.findall(pattern, text)
print(f"匹配到的数字:{
      
      matches}")

输出:

匹配到的数字:['2', '5']

进阶正则表达式

1. 贪婪匹配与非贪婪匹配

  • 贪婪匹配:尽可能多地匹配字符,直到整个模式不再匹配为止。
  • 非贪婪匹配:尽可能少地匹配字符。
示例:贪婪匹配与非贪婪匹配
import re

# 贪婪匹配
pattern_greedy = r"<.*>"
text = "<html><body>Hello, World!</body></html>"
result_greedy = re.findall(pattern_greedy, text)
print(f"贪婪匹配结果:{
      
      result_greedy}")

# 非贪婪匹配
pattern_non_greedy = r"<.*?>"
result_non_greedy = re.findall(pattern_non_greedy, text)
print(f"非贪婪匹配结果:{
      
      result_non_greedy}")

输出:

贪婪匹配结果:['<html><body>Hello, World!</body></html>']
非贪婪匹配结果:['<html>', '<body>', '</body>', '</html>']

2. 分组与捕获

分组使用圆括号()表示,捕获组可以提取匹配的子字符串。

示例:使用分组提取信息
import re

pattern = r"(\d{3})-(\d{2})-(\d{4})"
text = "My SSN is 123-45-6789."
match = re.match(pattern, text)
if match:
    print(f"匹配的区域:{
      
      match.groups()}")

输出:

匹配的区域:('123', '45', '6789')

3. 替换

使用re.sub()方法可以进行字符串替换。

示例:使用re.sub()进行替换
import re

pattern = r"\d+"
replacement = "#"
text = "My phone number is 12345 and my zip code is 67890."
result = re.sub(pattern, replacement, text)
print(f"替换后的文本:{
      
      result}")

输出:

替换后的文本:My phone number is ##### and my zip code is #####.

4. 查找所有匹配项

使用re.findall()可以查找所有匹配的项。

示例:查找所有电子邮件地址
import re

pattern = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"
text = "Please contact us at [email protected] or [email protected]."
matches = re.findall(pattern, text)
print(f"匹配到的电子邮件地址:{
      
      matches}")

输出:

匹配到的电子邮件地址:['[email protected]', '[email protected]']

常见应用场景

  1. 验证输入:例如验证电子邮件地址、电话号码等。
  2. 提取信息:从文本中提取特定格式的数据,如日期、时间、金额等。
  3. 文本替换:替换文本中的特定内容,如清洗数据、格式化输出等。
  4. 文本解析:解析HTML、XML或JSON等格式的文本数据。

总结

正则表达式是一个强大而灵活的工具,可以帮助我们高效地处理各种字符串匹配和替换任务。Python的re模块使得正则表达式在Python中得到了广泛应用,掌握正则表达式的基本语法和常用功能,将极大提升你处理文本的能力。

如果你还对正则表达式有疑问或想深入了解,可以参考官方文档或进一步的学习资源。掌握它,你将成为一个更高效的程序员。