Python系列五之正则表达式

正则表达式,Regular Expression,可用于在一个目标字符串里对于指定模式的字符进行查找、替换、分割等操作。

比如,判断某个字符串里是否都是数字,或者是否包含指定字符串,又或者更直接的例子是判断电话号码或者邮箱是否合法等。

这一篇笔记里,我们将先介绍一个正则表达式的函数,并以此来引入正则表达式的各种模式,并辅以各个例子进行介绍。

u1s1,正则表达式,我学了三四遍,学一遍忘一遍,忘一遍学一遍,只要隔一阵子不用就会忘,所以这一篇笔记力求将正则表达式的所有模式和用法都记录下来,用作之后的查找笔记。

以下笔记使用 Python 版本是 3.8。

以下是本篇笔记目录:

  1. re.findall
  2. 表达式语法
    1. 匹配字符串类型
      1. \b-匹配空字符串,但只在单词开始或结尾
      2. \B-匹配空字符串,不能在开头或结尾
      3. \d-匹配十进制数字
      4. \D-匹配非十进制字符
      5. \s-匹配空白字符
      6. \S-匹配非空白字符
      7. \w-匹配字符
      8. \W-匹配非单词字符
    2. 匹配字符串出现位置
      1. \A-只匹配字符串开始
      2. \Z-只匹配字符串结尾
      3. ^-匹配字符串开头
      4. $-匹配字符串结尾
    3. 匹配字符串数量
      1. *-匹配重复 0 到 n 次
      2. +-匹配重复 1 到 n 次
      3. ?-匹配重复 0 到 1 次
      4. {}-指定匹配重复次数
        a. {m}-只匹配重复 m 次
        b. {m,n}-匹配重复 m 到 n 次
    4. 匹配字符串集合
      1. 字符可以单独列出
      2. 可以表示字符范围
      3. 特殊字符在集合里只会匹配其原始字符含义
      4. 字符类 \s 或 \w 可以在集合里使用
      5. 取反操作可以使用 ^
    5. 其他匹配类型
      1. |-表达式的或操作
      2. ()-匹配括号内的任意正则表达式
  3. 常用正则方法
    1. re.search
    2. re.match
    3. re.split
    4. re.findall
    5. re.finditer
    6. re.sub
    7. re.subn
    8. re.compile
    9. 其他参数
      1. re.I
      2. re.M
  4. re.Match 匹配对象
    1. Match.group()
    2. Match.__getitem__(g)
    3. Match.groups()
    4. Match.re
    5. Match.string
    6. Match.start() 和 Match.end()
    7. Match.span()

1、re.findall

使用正则表达式,首先要引入模块:

import re

这里从 re.findall 开始介绍,findall 方法表示的是找到目标字符串里符合指定模式的全部数据。

比如我们有一个字符串 abcdefg,想要从其中找到 de,就可以如下操作:

str_1 = "abcdefg"
target_str = "de"
print(re.findall(target_str, str_1))

返回的就是一个列表,列表元素是我们的目标字符串 de

['de']

我们的 target_str 就是一个匹配模式,这里是一个纯字符串,我们可以将其替换成其他的模式字符串。

接下来我们将分类介绍正则表达式语法。

2、表达式语法

正则表达式有很多种,比如表示匹配数量的 +*?,还有表示匹配字符串内容的 \s\w 等。

下面将从这些类别分别开始介绍:匹配字符串类型、匹配字符串出现位置、匹配字符串数量、匹配字符串集合等

1. 匹配字符串类型

1) \b-匹配空字符串,但只在单词开始或结尾

\b 可以匹配空字符串,但是只在字符串开始或者结尾的位置,这里的空字符串涵盖了标签符号,比如 , . ,。? 等,也包括换行制表符 \n \t 等,也包含 '',可以理解为字符串的边界部分。

所以 \b 的作用其实就可用于匹配特定字符串的前缀或者后缀,这里的前缀和后缀并不仅仅是指整个字符串的前缀和后缀,也包括字符串内部被分割的前缀和后缀。

比如对于下面这个字符串:

i have a apple

我们想找到是否有 ha 开头的单词,可以如此操作:

str_1 = "i have a apple"
target_pattern = r"\bha"
print(re.findall(target_pattern, str_1))

字符串如果是以下几种情况,也可以匹配上:

str_1 = "i ,have a apple"
str_1 = "i \thave a apple"
str_1 = "i ha"

我们还可以使用 \b 来匹配特定的单词,在英文中,单词的出现是前后都有空格或者标点符号的,那么我们就可以前后都加上 \b 来限定匹配是否出现过此单词:

str_1 = "i have an apple"
str_1 = "i have an apple, "
str_1 = "i have an apple how are you"

target_pattern = r"\bapple\b"
print(re.findall(target_pattern, str_1))

2) \B-匹配空字符串,不能在开头或结尾

\B 是 \b 的取非操作,含义是匹配空字符串,但是不能出现在开头或者结尾,也就是说 \B 所在的位置必须有 1 至多个非空字符串来替代:

str_1 = "i have an apple"
target_pattern = r"app\B"
print(re.findall(target_pattern, str_1))

3) \d-匹配十进制数字

\d 用来匹配十进制数字,也就是 0-9 这些,比如下面的操作:

str_1 = "asdas98123asa978d"
target_pattern = r"\d"
print(re.findall(target_pattern, str_1))
# ['9', '8', '1', '2', '3', '9', '7', '8']

可以看到返回的结果是分隔开的数字,如果想要他们在一起返回,我们可以使用 \d+ 来操作,+ 表示的匹配 1 到 n 次,这个后面再介绍。

4) \D-匹配非十进制字符

\D 表示的是 \d 相反的操作,非十进制字符,可以使用上面的示例进行测试。

5) \s-匹配空白字符

\s 匹配的空白字符不包括标点符号,常见的有换行符,制表符,回车符等转义字符,\n \t \r \f 等

str_1 = "asdas9812\v3a\rs,.\ta9\n78\fd"
target_pattern = r"\s"
print(re.findall(target_pattern, str_1))

6) \S-匹配非空白字符

\S 是 \s 取非操作,除了上面的换行符、制表符等字符外,包括标点符号皆可被匹配上

7) \w-匹配字符

\w 不匹配换行符、制表符等转义字符,不匹配中英文常见标点符号,比如 , . ; " 等,但是可以匹配中英文字符、数字和下划线,比如下面的示例:

str_1 = "asd—— _a你‘'好,s9。8?12\v3a\rs,.\ta9\n78\fd"
target_pattern = r"\w"
print(re.findall(target_pattern, str_1))
# ['a', 's', 'd', '_', 'a', '你', '好', 's', '9', '8', '1', '2', '3', 'a', 's', 'a', '9', '7', '8', 'd']

8) \W-匹配非单词字符

\W 是 \w 的取反操作。

2. 匹配字符串出现位置

前面介绍的匹配字符串的类型,这里介绍匹配出现的位置,比如开头或者结尾。

1) \A-只匹配字符串开始

\A 只匹配字符串的开始,也就是我们所说的字符串前缀:

str_1 = "asd—— _a你‘'好,\ns9。8?12\v3a\rs,.\ta9\n78\fd"
target_pattern = r"\Aasd"
print(re.findall(target_pattern, str_1))

与字符串的 startswith() 函数在匹配功能上是一样的。

2) \Z-只匹配字符串结尾

\Z 只匹配字符串结尾部分,也就是所说的字符串后缀:

str_1 = "asd—— _a你‘'好,\ns9。8?12\v3a\rs,.\ta9\n78d"
target_pattern = r"d\Z"
print(re.findall(target_pattern, str_1))

3) ^-匹配字符串开头

^ 也是只匹配字符串的开头,但是与 \A 不同的是,使用 re.M 模式下,也可以匹配换行符后的开头,比如下面的示例,就可以返回两个结果:

str_1 = "asd—— _\na你‘'好,\ns9。8?12\v3a\rs,.\ta9\n78d"
target_pattern = r"^a"
print(re.findall(target_pattern, str_1, re.M))
# ['a', 'a']

如果去掉 re.M,则会退化成 \A 的功能

4) $-匹配字符串结尾

$ 也是只匹配字符串的结尾,但是在 re.M 模式下,也可以匹配换行符后新一行的结尾,比如下面的示例,可以返回两个结果:

str_1 = "asd—— _\na你‘'好,\ns9。8?12\v3a\rs,.\ta9d\n78d"
target_pattern = r"d$"
print(re.findall(target_pattern, str_1, re.M))

同理,如果去掉 re.M,则会退化成 \Z 的功能。

3. 匹配字符串数量

除了匹配指定模式的内容,字符位置,我们还可以匹配指定模式的数量,比如想只要满足一个即可返回,或者尽可能多的将满足的字符返回等。

接下来一一介绍如何匹配字符串数量。

1) *-匹配重复 0 到 n 次

* 表示匹配的数量可以重复从 0 到 n 次,这个 n 为任意次,尽量多的匹配字符串。

比如我们想匹配 a 以及 a 后面可以加上任意个 b 字符,比如希望 aababbabbbb 等都可以被匹配上。

那么就可以使用下面的操作:

str_1 = "axxxxabbxxxxabbbb"
target_pattern = r"ab*"
print(re.findall(target_pattern, str_1))
# ['a', 'abb', 'abbbb']

2) +-匹配重复 1 到 n 次

+ 表示匹配的数量可以重复从 1 到 n 次,提前条件是匹配模式必须出现一个。

还是上面的例子,我们希望可以匹配上 ababbb,以及无限多个 b,但是不可匹配 a,可以如下操作:

str_1 = "axxxxabbxxxxabbbb"
target_pattern = r"ab+"
print(re.findall(target_pattern, str_1))
# ['abb', 'abbbb']

3) ?-匹配重复 0 到 1 次

? 表示匹配的数量只能出现 0 到 1 次。

比如对于一个字符串,我们想匹配 apple 这个单词,但是我们也想使 apple 的复数形式 apples 也能被匹配上,所以我们这里的 s 希望它出现的次数是 0 到 1 次

str_1 = "i have an apple, he has two apples, she has three apples"
target_pattern = r"apples?"
print(re.findall(target_pattern, str_1))
# ['apple', 'apples', 'apples']

4) {}-指定匹配重复次数

使用花括号可以指定重复的次数,可以是一个固定的值,也可以是一个范围,下面分别介绍一下。

a. {m}-只匹配重复 m 次

{m} 表示匹配重复次数为 m,比如我们想要匹配 abbb,也就是 a 字符后重复出现三个 b,可以如下操作:

str_1 = "abbxxxxabbbbaxxxabbb"
target_pattern = r"ab{3}"
print(re.findall(target_pattern, str_1))
b. {m,n}-匹配重复 m 到 n 次

{m,n} 表示匹配重复次数为 m 到 n 次,比如我们想要 a 后面跟着 3,4,5个 b 都可以接受,可以如下操作:

str_1 = "abbbxxxxabbbbbbaxxxabbbb"
target_pattern = r"ab{3,5}"
print(re.findall(target_pattern, str_1))
# ['abbb', 'abbbbb', 'abbbb']

4. 匹配字符串集合

我们可以使用中括号 [] 来限定字符串或者匹配模式的集合,也就是说我们可以将我们想要匹配的字符串或者类型都加到 [] 里,满足条件的都可以被匹配返回。

1) 字符可以单独列出

如果我们想匹配某些单个字符,可以单独列出来操作,比如 a, t, w, q,可以使用 [atwq],以下是示例:

str_1 = "asdqweasdaterq"
target_pattern = r"[atwq]"
print(re.findall(target_pattern, str_1))
# ['a', 'q', 'w', 'a', 'a', 't', 'q']

2) 可以表示字符范围

我们可以使用 - 来表示字符的范围进行匹配,比如 a-z,或者数字类型的 0-9,比如下面的操作:

str_1 = "asdqweasdaterq"
target_pattern = r"[a-j]"
print(re.findall(target_pattern, str_1))
# ['a', 'd', 'e', 'a', 'd', 'a', 'e']
str_1 = "asd136q78w9ea95sd6ater"
target_pattern = r"[4-9]"
print(re.findall(target_pattern, str_1))
# ['6', '7', '8', '9', '9', '5', '6']

注意: 在这里的连接符 - 是表示范围的,如果只是想匹配 - 字符,需要使用 \ 进行转义,或者将 - 放在首位或者末位:

str_1 = "asd136q-78w-9e-a95sd6zater"
target_pattern = r"[a\-z]"
print(re.findall(target_pattern, str_1))
# ['a', '-', '-', '-', 'a', 'z', 'a']

上面的这个操作表示的是希望匹配上 - a 和 z 三个字符。

3) 特殊字符在集合里只会匹配其原始字符含义

特殊字符,比如前面表示数量的 * + 等字符在中括号里就匹配的是对应的星号和加号:

str_1 = "asdas*adas+asds(das)dasd"
target_pattern = r"[*+()]"
print(re.findall(target_pattern, str_1))
# ['*', '+', '(', ')']

4) 字符类 \s 或 \w 可以在集合里使用

比如下面的操作,可以 \W 和 0-9 之间的字符:

str_1 = "asdas*adas+asds(90123das)dasd"
target_pattern = r"[\W0-9]"
print(re.findall(target_pattern, str_1))
# ['*', '+', '(', '9', '0', '1', '2', '3', ')']

5) 取反操作可以使用 ^

如果要取反,意思是集合里的匹配模式都不匹配,比如我们想匹配字符串里的非数字,可以如下操作:

str_1 = "asdas*adas+asds(90123das)dasd"
target_pattern = r"[^\d]"
print(re.findall(target_pattern, str_1))
# ['a', 's', 'd', 'a', 's', '*', 'a', 'd', 'a', 's', 'a', 's', 'd', 's', '(', 'd', 'a', 's', ')', 'd', 'a', 's', 'd']

5. 其他匹配类型

1) |-表达式的或操作

比如我们有两个表达式 A 和 B,只要有一个符合条件即可,即匹配模式的或操作:

re.findall(r"\d+|[a-z]+", "asdas234asd2341")
# ['asdas', '234', 'asd', '2341']

2) ()-匹配括号内的任意正则表达式

小括号表示分组,可以将匹配模式分组放到多个小括号内进行匹配,匹配后的结果也会以元组的形式分组返回。

比如我们想匹配 英文字母+数字 的形式,并且以括号的形式将其分隔开,那么返回的匹配结果也会以元组的形式将其返回:

str_1 = "asdas9872"
target_pattern = r"([a-z]+)(\d+)"
result = re.findall(target_pattern, str_1)print(result)
# [('asdas', '9872')]

如果是匹配上了多个结果,那么多个结果会以列表的形式返回,元素也是匹配的结果以元组的形式返回:

str_1 = "asdas9872asdasklqw8267"
target_pattern = r"([a-z]+)(\d+)"
result = re.findall(target_pattern, str_1)print(result)
# [('asdas', '9872'), ('asdasklqw', '8267')]

3、常用正则方法

前面介绍了 re.findall() 方法,返回的是一个列表,元素是所有匹配上的结果,接下来介绍一些其他常用的正则方法。

1. re.search

re.search() 方法的作用是扫描整个目标字符串,找到匹配上的第一个位置,然后返回一个匹配对象,如果没有满足要求的数据,则返回 None。

这里要注意三点,一点是扫描整个字符串,直到找到匹配的对象,另一点是找到一个符合条件的字符串以后就停止扫描,即便后面还有符合条件的,三是返回一个匹配对象,关于匹配对象下面再介绍。

比如下面的示例是匹配 英文字母+数字:

str_1 = "..()-+/?asdas9872asdasklqw8267"
target_pattern = r"[a-z]+\d+"
result = re.search(target_pattern, str_1)
# <re.Match object; span=(8, 17), match='asdas9872'>

可以看到这里,其实有多个符合匹配模式的数据,如果这里使用 re.findall() 会返回多个值,但这里返回的只是字符串里第一个符合条件的数据。

至于如何获取返回的这个 re.Match 对象详情数据,见第四节 re.Match 匹配对象,建议先阅读该章节再往后读。

2. re.match

re.match() 方法也是用于匹配指定模式,效果上与 re.search() 无异,唯一不同的一点是 match() 方法只能从字符串的头部开始匹配,返回的也是一个 re.Match 对象。

比如下面的操作,第一种形式匹配不到数据,返回 None,第二种就可以返回 re.Match 对象:

str_1 = "..()-+/?asdas9872asdasklqw8267"
target_pattern = r"[a-z]+\d+"
result = re.match(target_pattern, str_1)
# None

str_1 = "asdas9872asdasklqw8267"
target_pattern = r"[a-z]+\d+"
result = re.match(target_pattern, str_1)
# <re.Match object; span=(0, 9), match='asdas9872'>

3. re.split

根据匹配模式将指定字符串进行分割,在效果上相当于 string.split() 的增强版。

因为 string.split() 不能使用正则对象来对字符串进行切割,而 re.split() 可以实现。

比如我们想要根据 1,2,3 对指定字符串进行切割,就可以用到 | 这个操作:

re.split(r"1|2|3", "as2da1s3asdsa")
# ['as', 'da', 's', 'asdsa']

我们也可以使用其他正则对象,比如我们想要根据字符串中的标点符号,空格等对字符串进行切割:

re.split(r"\W+", "i have an apple, you have two apples!")
# ['i', 'have', 'an', 'apple', 'you', 'have', 'two', 'apples', '']

re.split() 还可以接受 maxsplit 参数,表示最多切割的次数:

re.split(r"\W+", "i have an apple, you have two apples!", maxsplit=2)
# ['i', 'have', 'an apple, you have two apples!']

4. re.findall

re.findall() 前面有过介绍,根据匹配模式获取所有的匹配字符,结果以列表形式返回,元素为匹配的字符串:

re.findall(r"\d+", "asd12asxda45asd456sd23")
# ['12', '45', '456', '23']

5. re.finditer

re.finditer() 函数与 re.findall() 函数效果类似,都是找到目标字符串里全部满足条件的字符串,但是不同的是 finditer() 返回的一个迭代器,迭代器保存的是匹配对象,也就是 re.Match 对象:

for item in re.finditer(r"\d+", "asd12asxda45asd456sd23"):
    print(item)
# <re.Match object; span=(3, 5), match='12'>
# <re.Match object; span=(10, 12), match='45'>
# <re.Match object; span=(15, 18), match='456'>
# <re.Match object; span=(20, 22), match='23'>

6. re.sub

替换函数,将字符串里的指定模式替换成目标字符串,然后返回:

re.sub(r"\d+", "***", "asd12asxda45asd456sd23")
# 'asd***asxda***asd***sd***'

7. re.subn

re.subn() 与 re.sub() 函数作用一致,都是替换目标字符串,但是返回的是一个元组,分别是替换后的字符串和替换的次数:

re.subn(r"\d+", "***", "asd12asxda45asd456sd23")
# ('asd***asxda***asd***sd***', 4)

8. re.compile

re.compile() 函数将正则表达式编译为一个正则表达式对象,然后可以调用前面介绍过的这些正则函数,比如 re.search(),re.match(),re.findall() 等。

pattern = re.compile(r"\d+")
pattern.match("3432asdas334asd34asd")
# <re.Match object; span=(0, 4), match='3432'>

re.complie() 这个函数的操作可以用于永福匹配模式,使程序更加高效。

9. 其他参数

接下来介绍一下正则模块在匹配情况下的一些其他参数。

1) re.I

忽略大小写。

对于目标字符串,如果存在字母大小写的情况,我们可以对原始字符串统一进行大写或者小写的操作,然后进行匹配,以忽略大小写的影响,也可以使用 re.I 参数:

re.search(r"[a-z]+", "123SDAFSDsa234ASDd34".lower())
# <re.Match object; span=(3, 11), match='sdafsdsa'>

re.search(r"[a-z]+", "123SDAFSDsa234ASDd34", re.I)
# <re.Match object; span=(3, 11), match='SDAFSDsa'>

2) re.M

多行匹配模式。

前面介绍 ^ 和 $ 这两个符号的匹配的时候介绍过,如果加上 re.M 参数,表示的是可以匹配字符串内部有换行符的开头和结尾的数据:

str_1 = "asd—— _\na你‘'好,\ns9。8?12\v3a\rs,.\ta9\n78d"
target_pattern = r"^a"
print(re.findall(target_pattern, str_1, re.M))
# ['a', 'a']

4、re.Match 匹配对象

对于一些函数,比如前面介绍的 re.search(),返回的就是一个 re.Match 对象,还是以上面的示例为例,如何获取 re.Match 中的数据呢,下面开始介绍。

1. Match.group()

group() 函数直接调用,或者添加参数 0,返回的是匹配的字符串数据:

print(result.group())
# asdas9872

print(result.group(0))
# asdas9872

而如果我们匹配的模式使用了小括号 () 进行了分组,那么则可以对 group() 函数添加其他 index 表示匹配的分组的结果,比如下面的操作:

str_1 = "..()-+/?asdas9872asdasklqw8267"
target_pattern = r"([a-z]+)(\d+)"
result1 = re.search(target_pattern, str_1)

print(result1.group(0))
# asdas9872

print(result1.group(1))
# asdas

print(result1.group(2))
# 9872

2. Match.__getitem__(g)

re.Match 对象实现了 getitem 这个魔术方法,所以我们可以通过索引的方式对来访问匹配的结果,其效果和 group(index) 是一致的:

print(result1[0])
print(result1.group(0))

print(result1[2])
print(result1.group(2))

3. Match.groups()

groups() 函数返回的是进行了分组匹配的结果,以元组的形式返回。

比如这里分组的 result1 对象:

print(result1.groups())
# ('asdas', '9872')

而 result 这个 Match 对象匹配模式里并没有使用小括号进行分组,所以返回的结果是空元组:

print(result.groups())
# ()

4. Match.re

返回的是生成这个 Match 对象的正则对象,也就是我们输入的 target_pattern:

print(result.re)
# re.compile('[a-z]+\\d+')

5. Match.string

返回的是传递到生成这个 Match 对象的原始字符串:

print(result.string)
# ..()-+/?asdas9872asdasklqw8267

6. Match.start() 和 Match.end()

这两个函数表示的是匹配上的字符串的开始位置和结束位置:

print(result.start(), result.end())
# 8 17

我们对原始字符串进行起始位置的截取就是 Match.group() 的结果:

print(str_1[result.start(): result.end()])
# asdas9872

print(result.group())
# asdas9872

而如果我们前面对匹配模式进行了分组的操作,也就是使用了小括号,比如返回的 result1,我们可以想 start() 和 end() 函数添加索引参数分别表示这两个分组结果开始和结束的下标位置:

print(result1.groups())
# ('asdas', '9872')

print(str_1[result1.start(1): result1.end(1)])
# asdas

print(str_1[result1.start(2): result1.end(2)])
# 9872

7. Match.span()

返回的是匹配结果的开始和结束位置,以元组的形式返回,其实就是一次性返回 Match.start() 和 Match.end() 的结果。

span() 函数也可以接受分组的参数返回分组的起始位置。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云端部署Stirling PDF:构建个人App的API调用指南(附Python源码)

今天发现一个Github的开源项目&#xff0c;Stirling PDF&#xff0c;项目地址如下&#xff1a;https://gitcode.com/Stirling-Tools/Stirling-PDFhttps://gitcode.com/Stirling-Tools/Stirling-PDF?utm_sourceartical_gitcode目前CSDN上已经有好几个up主都介绍了这个项目&…

cocos=》 预乘、混合(黑边、白色)

简介 预乘&#xff0c;指的是在数据提交给GPU之前&#xff0c;就对纹理的RGB分量与alpha值进行计算。 预乘计算 结果颜色 源颜色值 目标颜色值 * (1 - 源 alpha 值) result source.RGB dest.RGB * (1 - source.A); 对应的颜色混合函数设置为 gl.blendFunc(gl.ONE, gl.…

英语复习之英语形近词总结

最近在练习英语口语&#xff0c;有很好的练习场景&#xff0c;和数字人对练&#xff0c;还能纠错&#xff0c;不过开口的基础需要单词量的支撑以及语法的熟悉&#xff0c;因为英语的语法太简单了&#xff0c;没啥需要复习和注意的&#xff0c;音标发音的问题也可以后期再纠正&a…

Angular进阶-NVM管理Node.js实现不同版本Angular环境切换

一、NVM介绍 1. NVM简介 Node Version Manager&#xff08;NVM&#xff09;是一个用于管理多个Node.js版本的工具。它允许用户在同一台机器上安装和使用多个Node.js版本&#xff0c;非常适合需要同时进行多个项目的开发者。NVM是开源的&#xff0c;支持MacOS、Windows和Linux…

wechat_OCR项目打包以及如何使用

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

医学图像处理:nii格式转换(3D切片为2D)

目录 NIFTI文件结构 读取NII文件 ITK-SNAP安装 使用方法 NII转PNG NIFTI文件结构 NIFTI 格式&#xff0c;是一种用于存储和交换医学成像数据的文件格式&#xff0c;特别适用于神经影像学领域。NIFTI文件通常有两个扩展名&#xff1a;.nii&#xff08;用于图像数据&#xf…

42.WEB渗透测试-信息收集-域名、指纹收集(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;41.WEB渗透测试-信息收集-域名、指纹收集&#xff08;3&#xff09; 关于单域名收集内容…

基于JSP的酒店客房管理系统(二)

目录 第二章 相关技术介绍 2.1 Jsp的简介 2.2 sql server 2005 的简介 第三章 系统的分析与设计 3.1 系统需求分析 1&#xff0e;理解需求 2&#xff0e;需求分析 3.2开发及运行环境 3.3功能模块的设计 3.3.1 设计目标 3.3.2 客房管理系统前台的设计 3.3.3 操作员管…

一种算法分类方式及其应用

在计算机科学领域&#xff0c;算法是解决问题的有效方法&#xff0c;而对算法进行分类有助于理解它们的特性、优劣以及在不同场景下的应用。常见的算法分类方法&#xff0c;包括按设计思想、问题类型、数据结构和应用领域等&#xff0c;每一类算法会对应有其典型和实际应用。 算…

大数据BI可视化(Echarts组件)项目开发-熟悉交互API5.0

全局echarts对象 init初始化 registerTheme注册主题 var mCharts echarts.init(document.querySelector("div"), itcast)registerMap地图图表 connect 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&qu…

javaFor循环-打印九九乘法表

虽然所有循环结构都可以用while或者do...while表示&#xff0c;但java提供了另一种循环语句--for循环&#xff0c;使一些循环结构变得简单。for循环语句是支持迭代的一种通用结构&#xff0c;是最有效&#xff0c;最灵活的循环结构。 先写第一列&#xff1a; 运行结果&#xf…

什么是开发者门户?最佳实践及示例

原文链接&#xff1a;https://document360.com/blog/api-developer-portal-examples 开发者门户是什么&#xff1f; DevPortal 奖的主要赞助商 Provonix 对开发者门户的定义如下&#xff1a; “开发者门户&#xff08;通常缩写为 DevPortal&#xff09;是一组 API、SDK 或其他…

【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程

【电机控制】七段式SVPWM扇区、矢量作用时间计算——对比simplefoc与Ti例程 文章目录 前言一、simplefoc——通过角度找扇区1.通过角度找扇区理论1.通过角度找扇区2.矢量作用时间计算3.矢量切换时间计算——七段式 2.simplefoc代码3.解读simplefoc代码1.通过角度找扇区2.矢量作…

关于YOLO8学习(四)模型转换为ncnn

前文 关于YOLO8学习(一)环境搭建,官方检测模型部署到手机 关于YOLO8学习(二)数据集收集,处理 关于YOLO8学习(三)训练自定义的数据集 简介 本文将会讲解: (1)如何通过PyCharm,进行pt模型的转换,最后输出一个适合手机端使用的模型 开发环境 win10、python 3.11…

[ARM系列]coresight(一)

原文链接 目的&#xff1a;对复杂SOC实现debug和trace的架构 典型环境 包含&#xff1a;2个ARM core&#xff0c;一个DSP&#xff0c;众多coresight组件 coresight组件实现对core、DSP的debug和trace功能 环境中包含3个通路 trace通路&#xff1a;将core和DSP内部信息输出到…

【机器学习-21】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林&#xff08;RF&#xff09; 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

【C++】学习笔记——vector_3

文章目录 七、vector3. vector的模拟实现4. vector实现代码整合 未完待续 七、vector 3. vector的模拟实现 上篇文章我们讲解了非常 玄幻 的拷贝构造函数&#xff0c;同样的方法&#xff0c;我们也能用这种方法来实现 赋值重载函数 。 void swap(vector<T>& v) {s…

【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解

一、计算机网络的发展背景 1、网络的定义 网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来&#xff0c;形成一个相互通信和共享资源的系统。 &#xff08;1&#xff09; 独立模式 独立模式 &#xff1a; 计算机之间相互独立。 &#xff08;2&#xff09;…

C语言二分查找的区间问题

概念 什么是二分查找呢&#xff1f; 二分查找&#xff1a;在有序数组中查找某一特定元素的搜索算法。 二分查找又称折半查找&#xff0c;通过将数组折半&#xff0c;用中间值和查找值作比较&#xff0c;多次使用&#xff0c;直到找到要查找的值。 注意:二分查找的前提是&#…

【xxl-job | 第二篇】Windows源码安装xxl-job

文章目录 2.Windows源码安装xxl-Job2.1拉取源码2.2IDEA导入2.3初始数据库数据2.4修改properties配置2.5启动admin并进入任务管理后台2.6jar包运行&#xff08;部署到Linux服务器上&#xff09;2.6.1打包2.6.2在xxl-job-admin打开jar包目录2.6.3cmd运行jar包 2.Windows源码安装x…
最新文章