python之正则表达式总结

news2024/11/12 11:10:32
正则表达式
对于正则表达式的学习,我整理了网上的一些资料,希望可以帮助到各位!!!

我们可以使用正则表达式来定义字符串的匹配模式,即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与模式匹配的部分提取出来或者替换掉。

概述

正则表达式[Regular Expression],简写为regex,RE,使用单个字符串来描述一系列具有特殊
格式的字符串。
功能:
        a.搜索
        b.替换
        c.匹配
使用情景:
        爬虫        验证手机号,验证邮箱,密码【用户名】
import re

# re.match()
# 匹配字符串是否以指定的正则内容开头,匹配成功返回对象,匹配失败返回None
# 第一个参数:正则表达式
# 第二个参数:要验证的字符串
# 第三个参数:可选参数,正则表达式修饰符

# \d:0 - 9
# +:表示出现1次或者多次
print(re.match(r"\d+", "12345esd"))
# <re.Match object; span=(0, 5), match='12345'>
print(re.match(r"\d+", "as12345esd"))
# None

# re.search()
# 匹配字符串中是否包含指定的正则内容,匹配成功返回对象,匹配失败返回 None
# 第一个参数:正则表达式
# 第二个参数:要验证的字符串
# 第三个参数:可选参数,正则表达式修饰符

search_result_1 = re.search(r"\d+", "12345esd")
if search_result_1:
    print("re.search() - 匹配成功:", search_result_1.group())
else:
    print("re.search() - 匹配失败")

search_result_2 = re.search(r"\d+", "as12345esd")
if search_result_2:
    print("re.search() - 匹配成功:", search_result_2.group())
else:
    print("re.search() - 匹配失败")

# 3. re.findall()
# 获取所有匹配的内容,会得到一个列表
# 第一个参数:正则表达式
# 第二个参数:要验证的字符串
findall_result = re.findall(r"\d+", "12abc34def56")
print("re.findall()结果:", findall_result)

表达式含义示例说明
.匹配除换行符以外的任意字符-
[0123456789]是字符集合,表示匹配方括号中所包含的任意一个字符匹配“123abc”中的1、2、3
[good]匹配good中任意一个字符匹配“good”中的g、o、o、d其中一个
[a-z]匹配任意小写字母匹配“abc”中的a、b、c
[A-Z]匹配任意大写字母匹配“ABC”中的A、B、C
[0-9]匹配任意数字,类似[0123456789]匹配“123abc”中的1、2、3
[0-9a-zA-Z]匹配任意的数字和字母匹配“123abcABC”中的任何字符
[0-9a-zA-Z_]匹配任意的数字、字母和下划线匹配“123abc_ABC”中的任何字符
[^good]匹配除了g、o、o、d这几个字符以外的所有字符,中括号里的^称为脱字符,表示不匹配集合中的字符匹配“hello”中的h、e、l、l
[^0-9]匹配所有的非数字字符匹配“abc”中的a、b、c
\d匹配数字,效果同[0-9]匹配“123abc”中的1、2、3
\D匹配非数字字符,效果同[^\d]匹配“abc”中的a、b、c
\w匹配数字、字母和下划线,效果同[0-9a-zA-Z_]匹配“123abc_ABC”中的任何字符
\W匹配非数字、字母和下划线,效果同[^\w]匹配“!@#”中的!、@、#
\s匹配任意的空白符(空格,回车,换行,制表,换页),效果同[ \n\t\f\r]匹配文本中的空格、回车等空白部分
import re

# [ ]:只匹配其中的一位
# - :表示一个区间
print(re.search("he[0-9]11o", "he911o"))
# <re.Match object; span=(0, 6), match='he911o'>1

print(re.search(r"go[zxc]od", "goxod"))
# <re.Match object; span=(0, 5), match='goxod'>

print(re.search("he[a-z]llo", "hepllo"))
# <re.Match object; span=(0, 6), match='hepllo'>

print(re.search("hello[0-9a-zA-Z_]", "hello9"))
# <re.Match object; span=(0, 6), match='hell09'>

print(re.search(r"hello\d", "hello2"))
# <re.Match object; span=(0, 6), match='hello2'>

print(re.search(r"hello\D", "hellowklo_"))
# <re.Match object; span=(0, 6), match='hellow'>

print(re.search(r"hello\w", "hello1"))
# <re.Match object; span=(0, 6), match='hello1'>

print(re.search(r"hello\W", "hello!"))
# <re.Match object; span=(0, 6), match='hello!'

print(re.search(r"mone\sy", "mone\ny"))
# <re.Match object; span=(0, 6), match='mone\ny'>

print(re.search(r"money[^0-9]", "money!"))
# <re.Match object; span=(0, 6), match='money!'

模式修饰符

模式修饰符:修饰我们写的正则表达式
  • .:表示匹配除了换行以外的任意单个字符        \n表示换行
  • re.S:可以通过,匹配到n(换行)
  • re.I:忽略字母大小写
import re

# 匹配 shenzhen 加一个除换行外的任意字符,这里能匹配 shenzhen9
result1 = re.search("shenzhen.", "shenzhen9")
print(result1)  # <re.Match object; span=(0, 9), match='shenzhen9'>

# 匹配 shenzhen 加一个除换行外的任意字符,这里不能匹配 shenzhen\n
result2 = re.search("shenzhen.", "shenzhen\n")
print(result2)  # None

# 匹配 shenzhen 加一个任意字符(因为使用了re.S,可匹配换行),这里能匹配 shenzhen\n
result3 = re.search("shenzhen.", "shenzhen\n", re.S)
print(result3)  # <re.Match object; span=(0, 9), match='shenzhen\n'>

# 匹配 shenzhen 加一个小写字母,这里不能匹配 shenzhenS 中的大写 S
result4 = re.search("shenzhen[a-z]", "shenzhenS")
print(result4)  # None

# 匹配 shenzhen 加一个字母(不区分大小写),这里能匹配 shenzhenS
result5 = re.search("shenzhen[a-z]", "shenzhenS", re.I)
print(result5)  # <re.Match object; span=(0, 9), match='shenzhenS'>

匹配多个字符

- - - - - - - - - - - - - - - - - - - - - - - - - - - - 匹配多个字符 - - - - - - - - - - - - - - - - - - - - - - - - - -

说明:下方的 x、y、z 均为假设的普通字符,n、m(非负整数),不是正则表达式的元字符。

  • (xyz):匹配小括号内的 xyz(作为一个整体去匹配)。
  • x?:匹配 0 个或者 1 个 x。
  • x*:匹配 0 个或者任意多个 x(.* 表示匹配 0 个或者任意多个字符(换行符除外))。
  • x+:匹配至少一个 x。
  • x{n}:匹配确定的 n 个 x(n 是一个非负整数)。
  • x{n,}:匹配至少 n 个 x。
  • x{,n}:匹配最多 n 个 x。
  • x{n,m}:匹配至少 n 个最多 m 个 x。注意:n ≤ m。
import re

# 匹配多个字符
#?:表示前面的字符可以出现 0 次或者 1 次(非贪婪模式)
#+:表示前面的字符可以出现 1 次或者多次(贪婪模式)
#*:表示前面的字符可以出现 0 次或者多次(贪婪模式)
#{}:表示前面的字符可以出现指定的次数或者次数的范围(贪婪模式)
# {3}:表示前面的字符只能出现 3 次
# {3,6}:表示前面的字符可以出现 3 - 6 次
# {3,}:表示前面的字符至少出现 3 次
# {,3}:表示前面的字符最多出现 3 次
import re

# ? 表示前面的字符出现0次或1次
# 0次的情况
result1 = re.search("goog?le", "goole")
print(result1)  # <re.Match object; span=(0, 5), match='goole'>
# 1次的情况
result2 = re.search("goog?le", "google")
print(result2)  # <re.Match object; span=(0, 6), match='google'>
# g出现多次的情况(不符合?的规则)
result3 = re.search("goog?le", "googggggle")
print(result3)  # None

# + 表示前面的字符出现1次或多次
# 0次不符合+规则
result4 = re.search("goog+le", "goole")
print(result4)  # None
# 1次的情况
result5 = re.search("goog+le", "google")
print(result5)  # <re.Match object; span=(0, 6), match='google'>
# 多次的情况
result6 = re.search("goog+le", "googgggggggggggle")
print(result6)  # <re.Match object; span=(0, 17), match='googgggggggggggle'>

# *表示前面的字符出现0次或多次
# 0次的情况
result7 = re.search("goog*le", "goole")
print(result7)  # <re.Match object; span=(0, 5), match='goole'>
# 多次的情况
result8 = re.search("goog*le", "googgggggggggggle")
print(result8)  # <re.Match object; span=(0, 17), match='googgggggggggggle'>

# {3}表示前面的字符恰好出现3次
# 不足3次
result9 = re.search("goog{3}le", "goole")
print(result9)  # None
# 不足3次
result10 = re.search("goog{3}le", "google")
print(result10)  # None
# 超过3次
result11 = re.search("goog{3}le", "googgggggggggle")
print(result11)  # None
# 恰好3次
result12 = re.search("goog{3}le", "googggle")
print(result12)  # <re.Match object; span=(0, 8), match='googggle'>

# {3,6}表示前面的字符出现3到6次
# 不足3次
result13 = re.search("goog{3,6}le", "goole")
print(result13)  # None
# 不足3次
result14 = re.search("goog{3,6}le", "googgle")
print(result14)  # None
# 在范围内
result15 = re.search("goog{3,6}le", "googgggle")
print(result15)  # <re.Match object; span=(0, 9), match='googgggle'>

# {3,}表示前面的字符至少出现3次
# 不足3次
result16 = re.search("goog{3,}le", "goole")
print(result16)  # None
# 不足3次
result17 = re.search("goog{3,}le", "google")
print(result17)  # None
# 至少3次
result18 = re.search("goog{3,}le", "googggle")
print(result18)  # <re.Match object; span=(0, 8), match='googggle'>
# 至少3次
result19 = re.search("goog{3,}le", "googgggggggggggggggle")
print(result19)  # <re.Match object; span=(0, 21), match='googgggggggggggggggle'>

# {,3}表示前面的字符最多出现3次
# 超过3次
result20 = re.search("goog{,3}le", "googgggle")
print(result20)  # None
# 在范围内
result21 = re.search("goog{,3}le", "googgle")
print(result21)  # <re.Match object; span=(0, 7), match='googgle'>
# 在范围内
result22 = re.search("goog{,3}le", "goole")
print(result22)  # <re.Match object; span=(0, 5), match='goole'>

匹配边界字符

import re

# ===== 边界字符 =====
# ^行首匹配(以指定字符开头),和在[]里的不是一个意思
# $行尾匹配
# ^文本$: 完全匹配
print(re.search("^world", "world"))  # <re.Match object; span=(0, 5), match='world'>
print(re.search("^world", "hworld"))  # None

print(re.search("world$", "12world"))  # <re.Match object; span=(2, 7), match='world'>
print(re.search("world$", "worlds"))  # None

print(re.search("^world$", "Iworlds"))  # None
print(re.search("^world$", "world"))  # <re.Match object; span=(0, 5), match='world'>
print(re.search("^world$", "worldworld"))  # None

print(re.search("^worl+ds$", "wor11111111d"))  # None

# 词边界
# \b匹配一个单词的边界,也就是单词和空格间的位置
# \B匹配非单词边界(了解)
print(re.search(r"google\b", "abc google 123google xcvgoogle456"))  # <re.Match object; span=(4, 10), match='google'>
print(re.search(r"google\B", "abcgoogle 123google xcvgoogle456"))  # <re.Match object; span=(0, 7), match='goog.le'>

# 转义、让正则表达式中的一些字符失去原有的意义
# \.表示一个单纯的.不是正则中的除了换行以外任意一个字符
print(re.search("goog\\.le", "goog.le"))  # <re.Match object; span=(0, 7), match='goog.le'>

# |表示或者(正则表达式1|正则表达式2只要满足其中一个正则表达式就能被匹配成功)
print(re.search("ef|cd", "123ef567"))  # <re.Match object; span=(3, 5), match='ef'>
匹配分组
() : 表示一个整体 , 表示分组 , 然后捕获
import re

tel = "0755-88988888"
pattern = r'(\d{4})-(\d{8})'  # 在字符串前面加上 r 表示原始字符串
result = re.search(pattern, tel)
if result:
    print(result)  # <re.Match object; span=(0, 13), match='0755-88988888'>
    print(result.group(0))  # 0755-88988888
    print(result.group(1))  # 0755
    print(result.group(2))  # 88988888
    print(result.groups())  # ('0755', '88988888')
else:
    print("未找到匹配的电话号码格式")

贪婪和非贪婪

贪婪匹配与非贪婪匹配概念

在正则表达式中,贪婪匹配和非贪婪匹配主要决定了匹配的字符数量。

  • 贪婪匹配:在满足匹配条件的情况下,尽可能多地匹配字符。例如,+ 是贪婪匹配的量词,当使用 d+ 时,它会尝试匹配尽可能多的数字。
  • 非贪婪匹配:在满足匹配条件的情况下,尽可能少地匹配字符。通过在贪婪量词(如 +*)后面添加 ? 来实现非贪婪匹配。例如,d+? 会尽可能少地匹配数字。
import re

# 正则表达式中的贪婪和非贪婪
# 贪婪匹配示例
result1 = re.findall(r"abc(\d+)", "abc2345678vf")
print("贪婪匹配结果:", result1)  # 贪婪匹配结果: ['2345678']

# 非贪婪匹配示例
result2 = re.findall(r"abc(\d+?)", "abc2345678vf")
print("非贪婪匹配结果:", result2)  # 非贪婪匹配结果: ['2']

re模块中常用功能函数

函数

说明

compile(pattern, flags=0)

编译正则表达式pattern,并返回一个正则表达式对象。flags用于指定正则表达式的匹配模式,如忽略大小写等。

match(pattern, string, flags=0)

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

search(pattern, string, flags=0)

搜索字符串string中第一次出现正则表达式pattern的模式。如果找到匹配项,返回一个匹配对象;否则返回None

split(pattern, string, maxsplit=0, flags=0)

使用正则表达式pattern作为分隔符拆分字符串stringmaxsplit指定最大分割次数,返回分割后的列表。

sub(pattern, repl, string, count=0, flags=0)

使用字符串repl替换字符串string中与正则表达式pattern匹配的所有模式。count指定替换次数,返回替换后的字符串。

fullmatch(pattern, string, flags=0)

如果字符串string与正则表达式pattern完全匹配(从开头到结尾),则返回匹配对象;否则返回None

findall(pattern, string, flags=0)

查找字符串string中所有与正则表达式pattern匹配的模式,并返回一个包含所有匹配项的列表。

finditer(pattern, string, flags=0)

查找字符串string中所有与正则表达式pattern匹配的模式,并返回一个迭代器,每个元素都是一个匹配对象。

purge()

清除隐式编译的正则表达式的缓存。

标志

说明

re.I 或 re.IGNORECASE

忽略大小写匹配。

re.M 或 re.MULTILINE

多行匹配,改变^$的行为,使它们分别匹配每一行的开始和结束,而不是整个字符串的开始和结束。

import re
# 1. re.match()
# 匹配字符串是否以指定的正则内容开头,匹配成功返回对象,匹配失败返回None
# 第一个参数:正则表达式
# 第二个参数:要验证的字符串
# 第三个参数:可选参数,正则表达式修饰符
text1 = "abc123"
match_result1 = re.match(r"abc", text1)
if match_result1:
    print("re.match()匹配成功:", match_result1.group())
else:
    print("re.match()匹配失败")

# 2. re.search()
# 匹配字符串中是否包含指定的正则内容,匹配成功返回对象,匹配失败返回None
# 第一个参数:正则表达式
# 第二个参数:要验证的字符串
# 第三个参数:可选参数,正则表达式修饰符
text2 = "hello abc world"
search_result = re.search(r"abc", text2)
if search_result:
    print("re.search()匹配成功:", search_result.group())
else:
    print("re.search()匹配失败")

# 3. re.findall()
# 获取所有匹配的内容,会得到一个列表
# 第一个参数:正则表达式
# 第二个参数:要验证的字符串
text3 = "a1b2c3a4b5"
findall_result = re.findall(r"\d", text3)
print("re.findall()结果:", findall_result)

# 4. re.compile()编译正则表达式,提高正则匹配的效率
string = "0755-89787654"
com = re.compile(r'(\d{4})-(\d{8})')
print(com.findall(string))

# 5. 拆分
# re.split()
print(re.split(r"\d", "sdf1234mkj5431km"))

# 6. 替换
# re.sub()或者re.subn()
str1 = "难以掩盖内心的心情"
print(re.sub(r"\s+", "..", str1))
print(re.subn(r"\s+", "..", str1))

# 7. 匹配中文
chinese = "[\u4e00-\u9fa5]+"
print(re.search(chinese, "hello!世界 345"))

综合案例

案例1:

"""
要求:用户名必须由字母、数字或下划线构成且长度在6~20个字符之间,QQ号是5~12的数字且首位不能为0
"""
import re

username = input('请输入用户名: ')
qq = input('请输入QQ号: ')
# match函数的第一个参数是正则表达式字符串或正则表达式对象
# match函数的第二个参数是要跟正则表达式做匹配的字符串对象
m1 = re.match(r'^[0-9a-zA-Z_]{6,20}$', username)
if not m1:
    print('请输入有效的用户名.')
# fullmatch函数要求字符串和正则表达式完全匹配
# 所以正则表达式没有写起始符和结束符
m2 = re.fullmatch(r'[1-9]\d{4,11}', qq)
if not m2:
    print('请输入有效的QQ号.')
if m1 and m2:
    print('你输入的信息是有效的!')

案例2:

import re

poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
sentences_list = re.findall(r'([^,。]+[,。]?)', poem)
for sentence in sentences_list:
    print(sentence)

print()

poem = '窗前明月光,疑是地上霜。举头望明月,低头思故乡。'
sentences_list = re.split(r'[,。]', poem)
sentences_list = [sentence for sentence in sentences_list if sentence]
for sentence in sentences_list:
    print(sentence)

总结

“很多事情都是熟能生巧,请大胆的去尝试吧!”

 

  恭喜你学会了正则表达式,快去试试吧!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板

文章目录 一、日志框架介绍1、浅谈与slfj4、log4j、logback的关系2、性能方面3、Slf4j使用方法 二、log4j配置三、log4j2配置1、SpringBoot整合Log4j22、非SpringBoot项目引入的依赖3、log4j2-spring.xml文件&#xff08;Spring项目&#xff09;或log4j2.xml&#xff08;非Spri…

StarUML建模工具安装学习与汉化最新零基础详细教程【一键式下载】(适用于Windows、MacOS系统、Linux系统)

StarUML破解安装下载教程 前言&#xff1a; StarUML破解与汉化安装下载教程&#xff0c;仅供学习研究和交流使用&#xff0c;禁止作为商业用途或其他非法用途&#xff01; 仓库作者&#xff1a;X1a0He&#xff0c;经仓库作者授权使用。 目录 StarUML破解安装下载教程1. 下载…

【网络安全】2.3 安全的网络设计_2.防御深度原则

文章目录 一、网络架构二、网络设备三、网络策略四、处理网络安全事件五、实例学习&#xff1a;安全的网络设计结论 网络设计是网络安全的基础&#xff0c;一个好的网络设计可以有效的防止攻击者的入侵。在本篇文章中&#xff0c;我们将详细介绍如何设计一个安全的网络&#…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…

如何找到系统中bert-base-uncased默认安装位置

问题&#xff1a; 服务器中无法连接huggingface&#xff0c;故需要自己将模型文件上传 ubuntu 可以按照这个链接下载 Bert下载和使用&#xff08;以bert-base-uncased为例&#xff09; - 会自愈的哈士奇 - 博客园 里面提供了giehub里面的链接 GitHub - google-research/be…

Qt 学习第十六天:文件和事件

一、创建widget对象&#xff08;文件&#xff09; 二、设计ui界面 放一个label标签上去&#xff0c;设置成box就可以显示边框了 三、新建Mylabel类 四、提升ui界面的label标签为Mylabel 五、修改mylabel.h&#xff0c;mylabel.cpp #ifndef MYLABEL_H #define MYLABEL_H#incl…

华为ensp配置bgp(避坑版)

文章目录 前言一、BGP是什么&#xff1f;二、拓扑三、基础配置四、测试五、拓展总结 前言 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是一种在互联网中使用的路径矢量协议。它主要用于在不同的自治系统&#xff08;AS&#xff09;之间交换路…

QT最新版6.8在线社区版安装教程

访问QT的官网&#xff1a; Qt | Tools for Each Stage of Software Development Lifecycle 点击 Download Try&#xff1a; 点击社区版最新在线安装&#xff1a; 往下翻网页&#xff0c; 点击下载&#xff1a; 开始安装&#xff1a; 使用--mirror进行启动安装程序&#xff1…

鸿蒙多线程开发——Worker多线程

1、概 述 1.1、基本介绍 Worker主要作用是为应用程序提供一个多线程的运行环境&#xff0c;可满足应用程序在执行过程中与主线程分离&#xff0c;在后台线程中运行一个脚本进行耗时操作&#xff0c;极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。 创建Worker的线…

海量数据迁移:Elasticsearch到OpenSearch的无缝迁移策略与实践

文章目录 一&#xff0e;迁移背景二&#xff0e;迁移分析三&#xff0e;方案制定3.1 使用工具迁移3.2 脚本迁移 四&#xff0e;方案建议 一&#xff0e;迁移背景 目前有两个es集群&#xff0c;版本为5.2.2和7.16.0&#xff0c;总数据量为700T。迁移过程需要不停服务迁移&#…

在配置环境变量之后使用Maven报错 : mvn : 无法将“mvn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

最近&#xff0c;我在 Windows 系统上安装和配置 Apache Maven 时遇到了一些问题&#xff0c;想在此记录下我的解决历程&#xff0c;希望对遇到类似问题的朋友有所帮助。 问题描述 我下载了 Maven 并按照常规步骤配置了相关的环境变量。然而&#xff0c;在 PowerShell 中输入…

大模型,智能家居的春秋战国之交

智能家居&#xff0c;大家都不陌生。尽管苹果、谷歌、亚马逊等AI科技巨头&#xff0c;以及传统家电厂商都在积极进入这一领域&#xff0c;但发展了十多年之后&#xff0c;智能家居依然长期呈现出一种技术上人工智障、市场上四分五裂的局面。 究其原因&#xff0c;是此前传统家电…

【设计模式】结构型模式(四):组合模式、享元模式

《设计模式之结构型模式》系列&#xff0c;共包含以下文章&#xff1a; 结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式结构型模式&#xff08;二&#xff09;&#xff1a;代理模式结构型模式&#xff08;三&#xff09;&#xff1a;桥接模式、外观…

众测遇到的一些案列漏洞

文章中涉及的敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打码处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中&#xff0c;我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

ThingsBoard规则链节点:RPC Call Reply节点详解

引言 1. RPC Call Reply 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 设备控制 3.2 状态查询 3.3 命令执行 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备管理…

动态规划(简单多状态 dp 问题 1.按摩师 2.打家劫舍 II 3. 删除并获得点数 4.粉刷房子 5.买卖股票的最佳时机(全系列))

面试题 17.16. 按摩师213. 打家劫舍 II740. 删除并获得点数LCR 091. 粉刷房子 &#xff08;原&#xff1a;剑指 Offer II 091. 粉刷房子&#xff09;309. 买卖股票的最佳时机含冷冻期714. 买卖股票的最佳时机含手续费123. 买卖股票的最佳时机 III188. 买卖股票的最佳时机 IV 1.…

【VBA实战】用Excel制作排序算法动画续

为什么会产生用excel来制作排序算法动画的念头&#xff0c;参见【VBA实战】用Excel制作排序算法动画一文。这篇文章贴出我所制作的所有排序算法动画效果和源码&#xff0c;供大家参考。 冒泡排序&#xff1a; 插入排序&#xff1a; 选择排序&#xff1a; 快速排序&#xff1a;…

关于Markdown的一点疑问,为什么很多人说markdown比word好用?

markdown和word压根不是一类工具&#xff0c;不存在谁比谁好&#xff0c;只是应用场景不一样。 你写博客、写readme肯定得markdown&#xff0c;但写合同、写简历肯定word更合适。 markdown和word类似邮箱和微信的关系&#xff0c;这两者都可以通信&#xff0c;但微信因为功能…

区块链技术在数字版权管理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 引言 区块链技术概述 …