为了账号安全,请及时绑定邮箱和手机立即绑定

Python正则表达式入门教程

概述

本文详细介绍了Python正则表达式的使用方法,涵盖了从基础语法到高级用法的各个方面。通过丰富的示例代码,读者可以学习到如何使用Python的re模块进行匹配、搜索、替换等操作。文章还提供了多个实战练习题,帮助读者掌握如何在实际场景中使用Python正则表达式。

正则表达式简介

正则表达式的定义和作用

正则表达式是一种强大的文本处理工具,它使用特定的模式来描述、匹配和操作文本。正则表达式可以用来进行搜索、替换、分割等文本处理任务。在编程中,正则表达式常用于文本解析、数据验证、文本搜索等领域。例如,它可以用来匹配电子邮件地址、电话号码、URL等特定格式的文本。

示例代码

import re

# 匹配简单的字符串
pattern = "hello"
text = "hello, world!"
match = re.match(pattern, text)
print(match.group())  # 输出 "hello"

Python中引入正则表达式的模块

Python中使用re模块来处理正则表达式。re模块提供了丰富的函数来实现正则表达式的各种操作。要使用re模块,你需要首先通过import re导入它。接下来,你可以使用re模块中的函数来编写和执行正则表达式。

示例代码

import re

# 匹配简单的字符串
pattern = "hello"
text = "hello, world!"
match = re.match(pattern, text)
print(match.group())  # 输出 "hello"
Python正则表达式基础语法

基本字符匹配

正则表达式中最基本的功能是匹配字符。例如,如果你想匹配字符串中的字母"a",你可以使用正则表达式"a"。这将匹配文本中的每个"a"字符。

示例代码

import re

pattern = "a"
text = "banana"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['a', 'a', 'a']

字符类

字符类用于匹配一组字符中的任何一个字符。字符类以方括号[]包围。例如,[abc]将匹配字符"a"、"b"或"c"中的任何一个。

示例代码

import re

pattern = "[abc]"
text = "cat in a hat"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['c', 'a', 'a', 'a', 'a']

量词

量词用于指定匹配一个模式的次数。常见的量词有*+?*表示匹配0次或多次,+表示匹配1次或多次,?表示匹配0次或1次。

示例代码

import re

pattern = "ha?"
text = "haha hahahaha ha"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['ha', 'h', 'ha']
Python正则表达式中的特殊字符

转义字符

某些字符在正则表达式中有特殊含义。如果你希望匹配这些字符本身,你需要使用反斜杠\来转义它们。例如,如果你想匹配"."字符,你需要使用\.

示例代码

import re

pattern = "\."
text = "example.dot"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['.', '.']

范围和排除字符

范围

范围字符类可以匹配一系列连续字符中的任何一个。例如,[a-z]将匹配任何小写字母,而[0-9]将匹配任何数字。

示例代码

import re

pattern = "[a-z]"
text = "HELLO world"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['w', 'o', 'r', 'l', 'd']

排除字符

排除字符类使用^来匹配不在指定字符类中的任何一个字符。例如,[^a]将匹配任何不为"a"的字符。

示例代码

import re

pattern = "[^a]"
text = "banana"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['b', 'n', 'n', 'a', 'a']

预定义字符类

re模块中包含了一些预定义的字符类,例如\d匹配任何数字,\w匹配任何字母、数字或下划线,\s匹配任何空白字符。

示例代码

import re

pattern = "\d"
text = "123 abc 456"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['1', '2', '3', '4', '5', '6']
Python正则匹配与搜索

使用re模块进行匹配

re模块提供了多种函数来执行正则匹配。常用的函数包括matchsearchfindall

match函数

match函数从字符串的开始位置尝试匹配正则表达式。如果匹配成功,返回匹配对象,否则返回None

示例代码

import re

pattern = "^hello"
text = "hello world"
match = re.match(pattern, text)
if match:
    print("Match found")
else:
    print("Match not found")

search函数

search函数在整个字符串中搜索匹配正则表达式的第一个位置。如果找到匹配项,返回匹配对象;否则返回None

示例代码

import re

pattern = "world"
text = "hello world"
match = re.search(pattern, text)
if match:
    print("Match found")
else:
    print("Match not found")

findall函数

findall函数在整个字符串中搜索所有匹配正则表达式的子串,并返回一个列表。

示例代码

import re

pattern = "world"
text = "hello world, world hello"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['world', 'world']

其他常用函数

re.split

re.split函数用来根据正则表达式分割字符串。它接受一个正则表达式模式和一个字符串,返回一个由分割部分组成的列表。

示例代码

import re

pattern = "\s"
text = "hello world, world hello"
split_text = re.split(pattern, text)
print(split_text)  # 输出 ['hello', 'world,', 'world', 'hello']

re.sub

re.sub函数用来替换字符串中匹配正则表达式的所有子串。它接受一个正则表达式模式、一个替换字符串和一个原始字符串,返回替换后的字符串。

示例代码

import re

pattern = "world"
text = "hello world, world hello"
new_text = re.sub(pattern, "planet", text)
print(new_text)  # 输出 'hello planet, planet hello'
Python正则表达式的高级用法

分组与引用

分组允许你在一个正则表达式中指定子匹配。你可以在正则表达式中使用圆括号()来创建分组。匹配到的分组可以在之后的匹配或替换中引用。

示例代码

import re

pattern = "(world) (planet)"
text = "hello world planet"
match = re.search(pattern, text)
if match:
    print(match.group(1))  # 输出 'world'
    print(match.group(2))  # 输出 'planet'

非贪婪匹配

非贪婪匹配使用?来匹配尽可能少的字符。例如,.*?将匹配尽可能少的任意字符,直到匹配到下一个模式。

示例代码

import re

pattern = "<.*?>"
text = "<tag1><tag2>"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['<tag1>', '<tag2>']

负向前瞻和后瞻

负向前瞻((?!)和负向后瞻((?<!))用于排除特定模式的匹配。它们允许你在匹配时排除某些特定的条件。

示例代码

import re

pattern = "(?<!\d)123(?!\d)"
text = "123 abc 123"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['123']
Python正则表达式实战练习

常见场景下正则表达式的使用

情景一:匹配电话号码

假设你需要从一段文本中提取所有的电话号码。电话号码的格式通常是XXX-XXX-XXXX

示例代码

import re

pattern = r"\d{3}-\d{3}-\d{4}"
text = "Call me at 123-456-7890 or 987-654-3210."
matches = re.findall(pattern, text)
print(matches)  # 输出 ['123-456-7890', '987-654-3210']

情景二:匹配电子邮件地址

假设你需要从一段文本中提取所有的电子邮件地址。电子邮件地址的格式通常是username@domain.com

示例代码

import re

pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"
text = "Please contact us at support@example.com or info@domain.com."
matches = re.findall(pattern, text)
print(matches)  # 输出 ['support@example.com', 'info@domain.com']

简单练习题与解答

练习题1:匹配URL

你需要编写一个正则表达式来匹配常见的URL格式。URL的格式通常是http(s)://www.domain.com/path

示例代码

import re

pattern = r"https?://[a-zA-Z0-9.-]+/[a-zA-Z0-9.-]*"
text = "Visit our website at https://www.example.com/path or http://www.domain.com"
matches = re.findall(pattern, text)
print(matches)  # 输出 ['https://www.example.com/path', 'http://www.domain.com']

练习题2:匹配日期格式

你需要编写一个正则表达式来匹配常见的日期格式。日期格式通常是MM/DD/YYYYDD/MM/YYYY

示例代码

import re

pattern = r"(0[1-9]|1[0-2])/(0[1-9]|[1-2][0-9]|3[0-1])/(19|20)\d\d"
text = "The events will be held on 01/01/2023 and 12/31/2023."
matches = re.findall(pattern, text)
print(matches)  # 输出 [('01', '01', '2023'), ('12', '31', '2023')]

通过以上内容,你应该已经掌握了Python正则表达式的基础知识和一些高级用法。你可以通过编写自己的正则表达式来解决各种文本处理任务,同时也可以参考更复杂的示例来学习更多技巧。为了进一步提高正则表达式的熟练度,建议多进行实际操作和练习。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消