【新人系列】Python 入门(十六):正则表达式

✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog

📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html

📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~

📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~

❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪
在线正则表达式测试:https://tool.oschina.net/regex/#

1. 正则表达式详解

介绍

正则表达式是一种用于匹配和操作文本的规则或语法:

  • 正则表达式拥有强大的文本处理能力,支持匹配、查找、替换等操作
  • 广泛的应用领域,例如编程、数据处理、文本处理等领域
  • 通用性强,跨语言跨场景

语法

2. 正则表达式实战

案例一

现在有这样一串字符,我需要根据需求查找出相应的字符信息。

text 复制代码
hello world 12345 is book 123
  1. 匹配出 hello 字符串
    1. 方法一:hello
    2. 方法二:^hello
  2. 匹配出所有数字
    1. 方法:\d+
  3. 匹配出所有字符串
    1. 方法:[a-zA-Z]+

案例二

要求写一个正则表达式,用来匹配邮箱,而邮箱规则如下:

  • 结构:前缀@后缀
  • 前缀:由大小写字母、数字、下划线、中划线等构成
  • 后缀:由小写字母或数字构成,并以 .com 结尾
text 复制代码
123@qq.com
test@email.com
xxx@123.com

匹配邮箱的正则表达式:

  1. 匹配单个邮箱
    1. 方法:^[a-zA-Z0-9_-]+@[a-z0-9]+.com$
  2. 匹配多个邮箱
    1. 方法:[a-zA-Z0-9_-]+@[a-z0-9]+.com

3. Python 正则表达式用法 - re 模块

3.1 re.search( )

在字符串中搜索匹配正则表达式的第一个位置。

python 复制代码
import re

text = "Hello, World!"
result = re.search('World', text)

# 找到匹配
if result:
    print("找到匹配")
    print(result)    # <re.Match object; span=(7, 12), match='World'>
    print(result.span())     # (7, 12)
    print(result.group())    # World
else:
    print("未找到匹配")

3.2 re.match( )

用于从字符串的起始位置匹配正则表达式,如果起始位置匹配成功,则返回一个匹配对象;否则返回 None。

python 复制代码
import re

text = "Hello World"
result = re.match('Hello', text)

# 匹配成功
if result:
    print("匹配成功")
    print(result)    # <re.Match object; span=(0, 5), match='Hello'>
    print(result.span())     # (0, 5)
    print(result.group())    # Hello
else:
    print("匹配失败")

Tips:

re.match() 只从字符串的起始位置进行匹配,而 re.search() 则会在字符串中搜索匹配的部分,不限于起始位置。

再看个复杂点的正则表达式,进一步理解一下 match 和 search 函数的区别。

python 复制代码
# !/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author:gdx
# @File:test.py.py
# @Project:test_python

import re

# 匹配1
text1 = "@#@!¥123_23134@qq.com"
result = re.match('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text1)
# 匹配失败
if result:
    print("匹配成功")
    print(result)
    print(result.group())
else:
    print("匹配失败")

# 匹配2
result = re.search('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text1)
# 匹配成功
if result:
    print("匹配成功")
    print(result)  # <re.Match object; span=(5, 21), match='123_23134@qq.com'>
    print(result.group())  # 123_23134@qq.com
else:
    print("匹配失败")

# 匹配3
text2 = "123_23134@qq.com"
result = re.match('[a-zA-Z0-9_-]+@[a-z0-9]+.com', text2)
# 匹配成功
if result:
    print("匹配成功")
    print(result)    # <re.Match object; span=(0, 16), match='123_23134@qq.com'>
    print(result.group())    # 123_23134@qq.com
else:
    print("匹配失败")

3.3 re.findall( )

返回字符串中所有匹配正则表达式的子串。

python 复制代码
import re

text = "apple, banana, cherry"
matches = re.findall('a[a-z]+', text)   # ['apple', 'anana']
print(matches) 

3.4 re.compile( )

re.complile() 用于编译正则表达式模式,生成一个正则表达式对象。这个对象可以被多次使用,从而提高效率。它接受一个字符串形式的正则表达式作为参数,并返回一个编译后的正则表达式对象。

除了前面提到的可以直接使用编译后的对象调用 findall 等方法之外,还可以设置一些标志参数来影响正则表达式的匹配行为。

常见的标志参数有:

  • re.IGNORECASE 或 re.I :使匹配对大小写不敏感。
  • re.MULTILINE 或 re.M :多行模式,影响 ^ 和 $ 的匹配行为。
  • re.DOTALL 或 re.S :使 . 匹配包括换行符在内的所有字符。
python 复制代码
import re

pattern = re.compile('hello', re.IGNORECASE)
text = "Hello World"
result = pattern.search(text)
if result:
    print("找到匹配")
    print(result)    # <re.Match object; span=(0, 5), match='Hello'>
    print(result.group())    # Hello
else:
    print("未找到匹配")

可以再来看一个分割字符串的例子。

python 复制代码
import re

data_list=[
    '2小时10分20秒',
    '3小时20分30秒',
    '1小时10分5秒'
]
pattern = re.compile('小时|分|秒')
for i in data_list:
    res = pattern.split(i)
    print(res)
    """
    ['2', '10', '20', '']
    ['3', '20', '30', '']
    ['1', '10', '5', '']
    """

3.5 ( ) 分组

使用括号 () 进行分组,可以提取匹配的子串。

python 复制代码
import re

pattern = re.compile(r"(\d{3})-(\d{3})-(\d{4})")
text = "My phone number is 123-456-7890"
result = pattern.search(text)
if result:
    print(result.group(1))   # 123
    print(result.group(2))   # 456
    print(result.group(3))   # 7890

Tips:

这里的 r 表示原始字符串,避免一些字符需要额外的转义。

3.6 re.sub( )

使用 re.sub() 函数可以进行替换操作。

python 复制代码
import re

text = "Hello, World!"
new_text = re.sub('World', 'Python', text)
print(new_text)  # Hello, Python!

我们再结合前面的分组方法看一个更复杂点的例子,我想要将一串手机号的中间 4 个数字进行加密处理,我们

python 复制代码
import re

# 方法一:分两组
pattern = re.compile(r"(\d{3})\d{4}(\d{3})")
text = "我有几个手机号分别是:1361234567,1331234567,1797654321"
new_text = pattern.sub(r"\1****\2", text)
print(new_text)  # 我有几个手机号分别是:136****567,133****567,179****321

# 方法二:分三组
pattern = re.compile(r"(\d{3})(\d{4})(\d{3})")
text = "我有几个手机号分别是:1361234567,1331234567,1797654321"
new_text = pattern.sub(r"\1****\3", text)
print(new_text)  # 我有几个手机号分别是:136****567,133****567,179****321
相关推荐
無限進步D1 小时前
Java 运行原理
java·开发语言·入门
是苏浙1 小时前
JDK17新增特性
java·开发语言
不光头强1 小时前
spring cloud知识总结
后端·spring·spring cloud
花酒锄作田3 小时前
企业微信机器人与 DeepAgents 集成实践
python·mcp·deepagents
GetcharZp4 小时前
告别 Python 依赖!用 LangChainGo 打造高性能大模型应用,Go 程序员必看!
后端
阿里加多4 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood5 小时前
java中`==`和`.equals()`区别
java·开发语言·python
小小李程序员5 小时前
Langchain4j工具调用获取不到ThreadLocal
java·后端·ai