Bootstrap

python3 re字符串查找、替换

python3 re

import re

"""
Python 的 `re` 模块是用来进行正则表达式匹配的工具,下面是一些常用的 `re` 用法:

1. `re.search(pattern, string)`:在字符串中查找匹配正则表达式的第一个位置,返回一个匹配对象。如果没有找到匹配的子串,返回 `None`。

2. `re.findall(pattern, string)`:在字符串中查找匹配正则表达式的所有子串,并以列表形式返回。

3. `re.sub(pattern, replace, string)`:在字符串中查找所有匹配正则表达式的子串,并将其替换为指定的字符串。

4. `re.compile(pattern)`:将正则表达式编译为一个对象,可以重复利用,提高效率。

5. `re.match(pattern, string)`:从字符串的开头匹配正则表达式,返回一个匹配对象。如果没有找到匹配的子串,返回 `None`。

6. `re.split(pattern, string)`:根据正则表达式分割字符串,返回一个以匹配项分隔字符串的列表。

7. `re.subn(pattern, replace, string)`:和 `sub()` 方法一样,但返回值为由被替换的字符串和替换后的次数构成的元组 `(new_string, count)`。

这里只是列举了部分常用的 `re` 方法,更详细的用法可以参考 Python3 的官方文档。
"""
import subprocess
import re

cmd="dmesg -T"
p=subprocess.run(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
msg=p.stdout.decode("utf-8")

#print(msg)

for line in msg.split("\n"):
    patt = re.compile("^.*nvme.*$")   #编译正则表达式成对象
    x=patt.match(line)		#匹配字符串,返回对象
    if x != None:
        print(x)
        print(x.group())
        print(x.span())
        print(x.start())
        print(x.end())
        print(x.groups())
    pa = re.compile("^.*nvme.*$")
    y = pa.search(line)
    if y != None:
        print(y.group())
        e=re.sub("0000","xxx",line,count=1,flags=0)  #替换
        print(e)

输出结果:

<_sre.SRE_Match object; span=(0, 64), match='[Mon Jun  5 18:24:16 2023] nvme nvme0: pci functi>
[Mon Jun  5 18:24:16 2023] nvme nvme0: pci function 0000:01:00.0
(0, 64)
0
64
()
[Mon Jun  5 18:24:16 2023] nvme nvme0: pci function 0000:01:00.0
[Mon Jun  5 18:24:16 2023] nvme nvme0: pci function xxx:01:00.0
<_sre.SRE_Match object; span=(0, 76), match='[Mon Jun  5 18:24:16 2023] nvme 0000:01:00.0: ena>
[Mon Jun  5 18:24:16 2023] nvme 0000:01:00.0: enabling device (0000 -> 0002)
(0, 76)
0
76
()
[Mon Jun  5 18:24:16 2023] nvme 0000:01:00.0: enabling device (0000 -> 0002)
[Mon Jun  5 18:24:16 2023] nvme xxx:01:00.0: enabling device (0000 -> 0002)

解析:
其中 _sre.SRE_Match object 是指这是一个匹配对象,span=(0, 64) 表示匹配的子串在原字符串中的起止位置为 (0, 64),match=‘[Mon Jun 5 18:24:16 2023] nvme nvme0: pci functi’ 表示匹配的子串为起止位置为 (0, 64) 的字符串。
在使用 re 模块进行正则表达式匹配时,如果匹配成功,re.search()、re.match()、re.findall()、re.finditer() 等方法都会返回一个匹配对象。匹配对象有一些方法和属性,可以用来查询和操作匹配的结果。
常用的匹配对象方法和属性包括:
group():返回匹配的子串。
span():返回匹配的子串在原字符串中的起止位置。
start():返回匹配的子串在原字符串中的起始位置。
end():返回匹配的子串在原字符串中的结尾位置。
groups():返回一个包含所有子组子串的元组

对于字符串替换的使用方法:
re.sub(pattern, replace, string) 是 re 模块中用于正则表达式替换的方法。它会在给定的字符串 string 中查找匹配 pattern 的子串,并用 replace 替换它们。最终返回替换后的新字符串。
如例:

e=re.sub("0000","xxx",line,count=1,flags=0)  #替换
print(e)
#在这里"0000"代表想要查找的字符串
# "xxx"代表想要替换成的字符串
# line代表原字符串
# 这里就是在字符串line中查找是否有 0000,如果有,就把他替换成 xxx

其中,pattern 是一个正则表达式字符串,replace 是一个替换字符串,可以是一个普通字符串,也可以是一个函数。如果 replace 是一个函数,则它会接收一个 match 对象作为参数,它的返回值将作为替换字符串。
解释:
pattern:正则表达式模式
repl:用于替换的字符串或函数
string:待替换的字符串
count:最大替换次数。默认为 0,表示替换所有匹配项。
flags:匹配控制标志。可以使用 re.IGNORECASE(或 re.I)、re.MULTILINE(或 re.M)等常量指定,也可以使用 | 运算符将多个标志组合。

re.IGNORECASE 或 re.I:忽略字母大小写。
re.MULTILINE 或 re.M:多行模式,影响字符 “^” 和 “$”。
re.DOTALL 或 re.S: “.” 可以匹配任意字符,包括换行符。
re.UNICODE 或 re.U:使匹配都是基于 Unicode 字符集定义的。
re.LOCALE 或 re.L:支持本地化识别

;