惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
K
Kaspersky official blog
T
The Exploit Database - CXSecurity.com
NISL@THU
NISL@THU
AWS News Blog
AWS News Blog
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security @ Cisco Blogs
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Commits to openclaw:main
Recent Commits to openclaw:main
J
Java Code Geeks
Microsoft Azure Blog
Microsoft Azure Blog
Attack and Defense Labs
Attack and Defense Labs
Jina AI
Jina AI
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
H
Help Net Security
V
Visual Studio Blog
宝玉的分享
宝玉的分享
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threat Research - Cisco Blogs
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
Latest news
Latest news
T
Tor Project blog
I
Intezer
美团技术团队
GbyAI
GbyAI
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
Google DeepMind News
Google DeepMind News
Scott Helme
Scott Helme
Y
Y Combinator Blog
博客园 - 司徒正美
T
Tenable Blog
O
OpenAI News
N
News and Events Feed by Topic
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threatpost
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
云风的 BLOG
云风的 BLOG
Help Net Security
Help Net Security

博客园 - tsembrace

Pandas数据分析教程,由浅入深讲解(五)Pandas IO操作 Pandas数据分析教程,由浅入深讲解(四) Pandas数据分析教程,由浅入深讲解(三) Pandas数据分析教程,由浅入深讲解(二) Pandas数据分析教程,由浅入深讲解(一) B站黑马Python+AI零基础入门(二)AI应用-实战 B站黑马Python+AI零基础入门(一)AI应用-基础 B站清华128小时Python高级教程一(C3深入类和对象) B站清华128小时Python高级教程一(C1、C2) B站python入门学习---第二阶段第二章数据库、SQL和MySQL B站python入门学习---第二阶段第一章类和对象 B站python入门学习---第一阶段第十章 数据可视化 B站python入门学习---第一阶段第八~九章 文件操作、异常、模块与包 B站python入门学习---第一阶段前七章回顾复习(二) B站python入门学习---第一阶段前七章回顾复习(一) Python入门学习(十)第十四章其他 Python入门学习(九)Python的高级语法与用法(四)装饰器 Python入门学习(九)Python的高级语法与用法(三)函数式编程 Python入门学习(九)Python的高级语法与用法(二)闭包 Python入门学习(九)Python的高级语法与用法(一)枚举 Python入门学习(八)JSON、反序列化、序列化 Python入门学习(七)高级部分:正则表达式 Python入门学习(六)高级部分:面向对象 Python入门学习(五)函数 Python入门学习(四)流程控制 包与模块
Python入门学习(七)高级部分:正则表达式(二)
tsembrace · 2025-08-03 · via 博客园 - tsembrace

一、re.sub正则替换

import re

language = "PythonC#JavaC#PHPC#JavaC#"
#re.sub方法用来替换字符
#最后一个参数1表示替换第一个
r1 = re.sub("C#", "GO", language, 1)
print(r1)
#最后一个参数0表示无限制替换下去
r2 = re.sub("C#", "GO", language, 0)
print(r2)

#传统字符串replace方法其实不是替换,而是新建
language1 = language.replace("C#", "GOO")
print(language,"\n", language1)

re.sub()方法还有一个重要的用法就是第二个参数可以是函数

import re

language = "PythonC#JavaC#PHPC#Java"

def convert(value):
    #当正则匹配的给该函数传参时,value实则是一个对象
    #需要用group()方法提取其值
    matched = value.group()
    print(matched)
    return "!!" + matched +"!!"

#当函数名作为sub()第二个参数时,将把第一个参数作为该函数的参数,再把函数返回值去替换
r = re.sub("C#", convert, language)
print(r)
import re

s = "A8C3721D86"

#要找出s中所有大于等于6的数字,全部替换为9
#小于6的数字,全部替换为0
def convert(value):
    matched = value.group()
    if int(matched) >=6:
        return "9"
    else:
        return "0"

r = re.sub("\d", convert, s)
print(r)

s1 = "A83C27D1D8E67"
#如果需要以连续两位数字作为一个整体
#如大于50的,替换为100
#小于50的,替换为0
#如只有一位数,则删除
def myconvert(value):
    matched = int(value.group())
    print(matched)
    if matched >= 50:
        return "100"
    elif matched > 9:
        return "0"
    else:
        return ""

r = re.sub("\d{1,2}", myconvert, s1)
print(r)

 二、match和search方法

import re

s = "83C72D1D8E67"
r0 = re.findall("\d", s)
print(r0)
#正则的match和serach方法使用基本和findall一致
#他们和findall最大的区别在于他们只匹配一次就结束
#match尝试从字符串首字符匹配
#其返回结果是一个对象
r1 = re.match("\d", s)
print(r1.group())
#span可以获取字符的位置
print(r1.span())
#search则是搜索,一旦搜索到则匹配到
r2 = re.search("\d", s)
print(r2.group())
print(r2.span())

关于group()方法

import re
s = "life is short, i use python!"
#要求提取life 和 python之间的字符
#首先需要定界:通过首尾定好life和python
#中间通过"."来匹配所有非换行符的字符(因为这里中间除了字母还有空格符)
#因为中间字符数量不确定,所以在"."后面加上*表示任意多个
r = re.search("life.*python", s)
print(r.group())
#但是上述输出还是包含了life和python这些定界标签字符
#上述life.*python虽然没有显式采用括号,其实就是一个组
#所以用group()还是会整体输出
#如下的方式将".*"括起来,则变成了内部的分组
r1 = re.search("life(.*)python", s)
#group(0)永远都是指定的整体
print(r1.group(0))
#可以通过group(1)去指定
print(r1.group(1))
#再通过下面这个例子加深理解
s1 = "lifeisshortiusepython"
r2 = re.search("is(\w*)use(p\w*n)", s1)
#获取整体,也可以通过group()
print(r2.group(0))
#获取内部第一个分组(\w*)
print(r2.group(1))
#获取内部第二个分组(p\w*n)
print(r2.group(2))
实际上,再比较一下findall实现上述功能的用法,更为简单
r_f1 = re.findall("life(.*)python", s)
r_f2 = re.findall("is(\w*)use(p\w*n)", s1)
print(r_f1)
print(r_f1[0])
print(r_f2)
print(r_f2[0][0])
print(r_f2[0][1])
import re
s = "life is short, i use python, i love python"
#要求找到life和python之间的字符,以及python和python之间的字符
r = re.search("life(.*)python(.*)python", s)
print(r.group())    #整体
print(r.group(1))  #第一个分组
print(r.group(2))  #第二个分组
#也可以如下方式,会以元组形式输出
print(r.group(0,1,2))
#groups()直接返回整体中间的各个分组
print(r.groups())
print(r.groups()[0])
print(r.groups()[1])

#同样的用findall实现如下
r1 = re.findall("life(.*)python(.*)python", s)
print(r1[0][0], "\n", r1[0][1])