正则的基本用法

2023-05-16

一、了解正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

正则表达式是用来匹配字符串非常强大的工具,在其他编程语言中同样有正则表达式的概念,Python同样不例外,利用了正则表达式,我们想要从返回的页面内容提取出我们想要的内容就易如反掌了。

正则表达式的大致匹配过程是:

1.依次拿出表达式和文本中的字符比较,
2.如果每一个字符都能匹配,则匹配成功;一旦有匹配不成功的字符则匹配失败。
3.如果表达式中有量词或边界,这个过程会稍微有一些不同。

二、正则表达式的语法规则

下面是Python中正则表达式的一些匹配规则,图片资料来自CSDN
这里写图片描述

三、正则表达式相关注解

(1)数量词的贪婪模式与非贪婪模式

正则表达式通常用于在文本中查找匹配的字符串。Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪的则相反,总是尝试匹配尽可能少的字符。例如:正则表达式”ab*”如果用于查找”abbbc”,将找到”abbb”。而如果使用非贪婪的数量词”ab*?”,将找到”a”。

注:我们一般使用非贪婪模式来提取。

(2)反斜杠问题

与大多数编程语言相同,正则表达式里使用”\”作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符”\”,那么使用编程语言表示的正则表达式里将需要4个反斜杠”\\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。

Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r”\”表示。同样,匹配一个数字的”\d”可以写成r”\d”。有了原生字符串,妈妈也不用担心是不是漏写了反斜杠,写出来的表达式也更直观勒。

(3)分组区配
通过引用编号或别名来匹配时,应特别注意:引用部分匹配的字符串与组区配的字符串应保持一致,如:
(\d)abc\1 能匹配5abc5,但不能匹配2abc5

四、Python Re模块

Python 自带了re模块,它提供了对正则表达式的支持。主要用到的方法列举如下

#返回pattern对象
re.compile(string[,flag])
#以下为匹配所用函数re.match(pattern,string[,flags])
re.search(pattern,string[,flags])
re.split(pattern,string[,maxsplit])
re.findall(pattern,string[,flags])
re.finditer(pattern,string[,flags])
re.sub(pattern,repl,string[,count])
re.subn(pattern,repl,string[,count])

在介绍这几个方法之前,我们先来介绍一下pattern的概念,pattern可以理解为一个匹配模式,那么我们怎么获得这个匹配模式呢?很简单,我们需要利用re.compile方法就可以。例如

pattern=re.compile(r'hello')

在参数中我们传入了原生字符串对象,通过compile方法编译生成一个pattern对象,然后我们利用这个对象来进行进一步的匹配。

另外大家可能注意到了另一个参数 flags,在这里解释一下这个参数的含义:

参数flag是匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M。

可选值有:

re.I(全拼:IGNORECASE):忽略大小写(括号内是完整写法,下同)
re.M(全拼:MULTILINE):多行模式,改变'^'和'$'的行为(参见上图)
re.S(全拼:DOTALL):点任意匹配模式,改变'.'的行为
re.L(全拼:LOCALE):使预定字符类\w\W\b\B\s\S取决于当前区域设定
re.U(全拼:UNICODE):使预定字符类\w\W\b\B\s\S\d\D取决于unicode定义的字符属性
re.X(全拼:VERBOSE):详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

在刚才所说的另外几个方法例如 re.match 里我们就需要用到这个pattern了,下面我们一一介绍。

注:以下七个方法中的flags同样是代表匹配模式的意思,如果在pattern生成时已经指明了flags,那么在下面的方法中就不需要传入这个参数了。

(1)re.match(pattern, string[, flags])

这个方法将会从string(我们要匹配的字符串)的开头开始,尝试匹配pattern,一直向后匹配,如果遇到无法匹配的字符,立即返回None,如果匹配未结束已经到达string的末尾,也会返回None。两个结果均表示匹配失败,否则匹配pattern成功,同时匹配终止,不再对string向后匹配。下面我们通过一个例子理解一下

__author__='CQC'
# -*- coding: utf-8 -*-
# 导入re模块
import re

# 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”
pattern=re.compile(r'hello')

# 使用re.match匹配文本,获得匹配结果,无法匹配时将返回None
result1=re.match(pattern,'hello')
result2=re.match(pattern,'helloo CQC!')
result3=re.match(pattern,'helo CQC!')
result4=re.match(pattern,'hello CQC!')
#如果1匹配成功
if result1:
# 使用Match获得分组信息
	print result1.group()
else:print'1匹配失败!'

#如果2匹配成功
ifresul t2:
# 使用Match获得分组信息
	print result2.group()
else:print'3匹配失败!'

#如果3匹配成功
if result3:# 使用Match获得分组信息
	print result3.group()
else:print'3匹配失败!'

#如果4匹配成功
if result4:# 使用Match获得分组信息
	print result4.group()
else:print'4匹配失败!'

运行结果

hello
hello3
匹配失败!
hello

匹配分析

1.第一个匹配,pattern正则表达式为’hello’,我们匹配的目标字符串string也为hello,从头至尾完全匹配,匹配成功。
2.第二个匹配,string为helloo CQC,从string头开始匹配pattern完全可以匹配,pattern匹配结束,同时匹配终止,后面的o CQC不再匹配,返回匹配成功的信息。
3.第三个匹配,string为helo CQC,从string头开始匹配pattern,发现到 ‘o’ 时无法完成匹配,匹配终止,返回None
4.第四个匹配,同第二个匹配原理,即使遇到了空格符也不会受影响。

我们还看到最后打印出了result.group(),这个是什么意思呢?下面我们说一下关于match对象的的属性和方法

Match对象是一次匹配的结果,包含了很多关于此次匹配的信息,可以使用Match提供的可读属性或方法来获取这些信息。

属性:

  1. string: 匹配时使用的文本。
  1. re: 匹配时使用的Pattern对象。
  2. pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
  3. endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
  4. lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
  5. lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。

方法:

1.group([group1, …]):

获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;不填写参数时,返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。

2.groups([default]):

以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。

3.groupdict([default]):

返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。

4.start([group]):

返回指定的组截获的子串在string中的起始索引(子串第一个字符的索引)。group默认值为0。

5.end([group]):

返回指定的组截获的子串在string中的结束索引(子串最后一个字符的索引+1)。group默认值为0。

6.span([group]):

返回(start(group), end(group))。

7.expand(template):

将匹配到的分组代入template中然后返回。template中可以使用\id或\g、\g引用分组,但不能使用编号0。\id与\g是等价的;但\10将被认为是第10个分组,如果你想表达\1之后是字符’0’,只能使用\g0。

下面我们用一个例子来体会一下

-*- coding: utf-8 -*-
#一个简单的match实例
import re
# 匹配如下内容:单词+空格+单词+任意字符
m=re.match(r'(\w+) (\w+)(?P.*)','hello world!')
print"m.string:",m.string
print"m.re:",m.re
print"m.pos:",m.pos
print"m.endpos:",m.endpos
print"m.lastindex:",m.lastindex
print"m.lastgroup:",m.lastgroup
print"m.group():",m.group()
print"m.group(1,2):",m.group(1,2)
print"m.groups():",m.groups()
print"m.groupdict():",m.groupdict()
print"m.start(2):",m.start(2)
print"m.end(2):",m.end(2)
print"m.span(2):",m.span(2)
printr"m.expand(r'\g \g\g'):",m.expand(r'\2 \1\3')

### output ###
# m.string: hello world!
# m.re: 
# m.pos: 0# m.endpos: 12
# m.lastindex: 3
# m.lastgroup: sign
# m.group(1,2): ('hello', 'world')
# m.groups(): ('hello', 'world', '!')
# m.groupdict(): {'sign': '!'}
# m.start(2): 6
# m.end(2): 11
# m.span(2): (6, 11)
# m.expand(r'\2 \1\3'): world hello!

(2)re.search(pattern, string[, flags])

search方法与match方法极其类似,区别在于match()函数只检测re是不是在string的开始位置匹配,search()会扫描整个string查找匹配,match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回None。同样,search方法的返回对象同样match()返回对象的方法和属性。我们用一个例子感受一下

#导入re模块
import re
# 将正则表达式编译成Pattern对象
pattern=re.compile(r'world')
# 使用search()查找匹配的子串,不存在能匹配的子串时将返回None
# 这个例子中使用match()无法成功匹配
match=re.search(pattern,'hello world!')
if match:
	# 使用Match获得分组信息
	print match.group()

### 输出 ###
# world

(3)re.split(pattern, string[, maxsplit])

按照能够匹配的子串将string分割后返回列表。maxsplit用于指定最大分割次数,不指定将全部分割。我们通过下面的例子感受一下。

import re
pattern=re.compile(r'\d+')
print re.split(pattern,'one1two2three3four4')

### 输出 #### 
['one', 'two', 'three', 'four', '']

(4)re.findall(pattern, string[, flags])
经验:
如果pattern里面不含分组,返回的是匹配字符串的列表,
如果pattern里面含有分组,列返回的是含有组匹配的列表
(1)如果只含有一个组,则返回的是一个字符串列表;

str='litaifa,123lijinhao,456jinshuyan,789family'
pat =re.compile(r'\w+,(\d+)')
items = re.findall(pat,str)
print type(items),items     

### 结果:<type 'list'> ['123', '456', '789']

(2)如果含有两个或多个组,则返回的是元组列表即,列表的每元素为元组

str='litaifa,123lijinhao,456jinshuyan,789family'
pat =re.compile(r'(\w+),(\d+)')
items = re.findall(pat,str)
print type(items),items
### 结果:<type 'list'> [('litaifa', '123'), ('lijinhao', '456'), ('jinshuyan', '789')]

(3)如果组允许多次匹配,只返回最后匹配的字符串

str='litaifa,123lijinhao,456jinshuyan,789family'
pat =re.compile(r'(\w)+,(\d+)')
items = re.findall(pat,str)
print type(items),items
### 结果:<type 'list'> [('a', '123'), ('o', '456'), ('n', '789')]

搜索string,以列表形式返回全部能匹配的子串。我们通过这个例子来感受一下

import re
pattern=re.compile(r'\d+')
print re.findall(pattern,'one1two2three3four4')

### 输出 ###
# ['1', '2', '3', '4']

(5)re.finditer(pattern, string[, flags])

搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。我们通过下面的例子来感受一下

import re
pattern=re.compile(r'\d+')
for m in re.finditer(pattern,'one1two2three3four4'):
	print m.group(),

### 输出 ###
# 1 2 3 4

(6)re.sub(pattern, repl, string[, count])

使用repl替换string中每一个匹配的子串后返回替换后的字符串。

当repl是一个字符串时,可以使用\id或\g、\g引用分组,但不能使用编号0。

当repl是一个方法时,这个方法应当只接受一个参数(Match对象),并返回一个字符串用于替换(返回的字符串中不能再引用分组)。

count用于指定最多替换次数,不指定时全部替换。

import re
pattern=re.compile(r'(\w+) (\w+)')
s='i say, hello world!'
print re.sub(pattern,r'\2 \1',s)

def func(m):
	return m.group(1).title()+' '+m.group(2).title()

print re.sub(pattern,func,s)

### output ###
# say i, world hello!
# I Say, Hello World!

(7)re.subn(pattern, repl, string[, count])

返回 (sub(repl, string[, count]), 替换次数)。

import re
pattern=re.compile(r'(\w+) (\w+)')
s='i say, hello world!'
print re.subn(pattern,r'\2 \1',s)
def func(m):
	returnm.group(1).title()+' '+m.group(2).title()
print re.subn(pattern,func,s)

### output ###
# ('say i, world hello!', 2)
# ('I Say, Hello World!', 2)

五、Python Re模块的另一种使用方式

在上面我们介绍了7个工具方法,例如match,search等等,不过调用方式都是 re.match,re.search的方式,其实还有另外一种调用方式,可以通过pattern.match,pattern.search调用,这样调用便不用将pattern作为第一个参数传入了,大家想怎样调用皆可。

函数API列表

match(string[,pos[,endpos]])|re.match(pattern,string[,flags])
search(string[,pos[,endpos]])|re.search(pattern,string[,flags])
split(string[,maxsplit])|re.split(pattern,string[,maxsplit])
findall(string[,pos[,endpos]])|re.findall(pattern,string[,flags])
finditer(string[,pos[,endpos]])|re.finditer(pattern,string[,flags])
sub(repl,string[,count])|re.sub(pattern,repl,string[,count])
subn(repl,string[,count])|re.sub(pattern,repl,string[,count])

转载请注明:静觅 » Python爬虫入门七之正则表达式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则的基本用法 的相关文章

  • 键盘输入 kbhit()

    函数名 xff1a kbhit 功能及返回值 xff1a 检查当前是否有键盘输入 xff0c 若有则返回一个非0值 xff0c 否则返回0 用 法 xff1a int kbhit void 包含头文件 xff1a include lt co
  • 设置光标输出位置

    void gotoXY short x short y 设置光标输出位置 COORD pos 61 x y HANDLE out 61 GetStdHandle STD OUTPUT HANDLE SetConsoleCursorPosit
  • tensorflow错误 Assign requires shapes of both tensors to match. lhs shape= rhs shape=

    在跑tensorflow任务的时候 xff0c 有时候会碰到这种错误 Tensorflow Assign requires shapes of both tensors to match lhs shape 61 20 rhs shape
  • 贪吃蛇游戏源码(可在VC++6.0运行)(在原作者的基础上进行小改进)

    自己做的第一个游戏 xff01 xff01 xff01 说说制作历程吧 xff1a 1 阅读并理解原作者 xff08 没有找到作者名 xff09 源码 2 仿写一边源码 3 经过一天的冥想 xff08 其实是玩了一天吃鸡 xff09 4 然
  • MFC插背景图

    把下面这段代码加进OnPaint 里就行了 CPaintDC dc this CBitmap bitmap bitmap LoadBitmap IDB BITMAP1 这个IDB BITMAP1要自己添加 CBrush brush brus
  • MFC按钮跳转

    需要先添加新建的dialo 的头文件 例如 include 34 AAA h 34 void COnclickDlg OnBnClickedOk AAA Dlg Dlg DoModal
  • MSDN关闭窗口

    退出程序用 AfxGetMainWnd gt SendMessage WM CLOSE 关闭当前窗口 用 DestroyWindow 关闭模式对话框用 EndDialog 0
  • 链表的插入和删除

    while NULL 61 p amp amp i lt pos 1 插入 p 61 p gt pNext 43 43 i if NULL 61 61 p i gt pos 1 return false while NULL 61 p gt
  • 初始化!

    int length list PNODE pHead int len 61 0 需要初始化 xff0c 不然会显示乱码 PNODE p 61 pHead gt pNext while NULL 61 p len 43 43 p 61 p
  • Python爬虫:爬虫所需要的爬虫代理ip是什么?

    当我们对某些网站进行爬去的时候 xff0c 我们经常会换IP来避免爬虫程序被封锁 代理ip地址如何获取 xff1f 其实也是一个比较简单的操作 xff0c 目前网络上有很多IP代理商 xff0c 例如西刺 xff0c 芝麻 xff0c 犀牛
  • MySQL知识点

    主键自增 JDBC中MySQL自增主键的值 xff1a 是通过connection连接发送sql语句时多传入一个参数conn prepareStatement sql PreparedStatement RETURN GENERATED K
  • C语言实现FTP文件传输

    一 要求 FTP实则为两个程序的互相交流 xff0c 把信息指令相互发送并处理 1 客户端请求下载文件 把文件名发送给服务器 2 服务器接收客户端发送的文件名 根据文件名找到文件 xff0c 把文件大小发送给客户端 3 客户端接收到文件大小
  • 我的2013,它不平淡

    2013年春节过后 xff0c 等我再赴学校 xff0c 我已经是大三下学期的学生了 对于一名软件学院的学生 xff0c 这就意味着要整备离开校园出去实习了 果然 xff0c 陆陆续续各大软件公司 xff08 培训部门而已 xff09 或培
  • mac下office文档自动恢复

    如果想要查找mac上自动恢复的文件 xff0c 可以在如下的文件目录中找到 xff0c 注意将 username 替换为自己的用户名 xff1a Excel Users username Library Containers com mic
  • FreeRTOS消息队列/信号量/事件

    1 消息队列主要用于任务之间消息的传递 2 信号量分为计数信号量 二值信号量 互斥信号量 3 事件用于外部事件的触发 4 计数信号量用于发生次数的统计 读取以后可以减1 二值信号量 互斥信号量与二值信号量的主要区别是可以防止优先级翻转 5
  • python装饰器详解-python中的装饰器详解

    在了解装饰器的之前一定要先了解函数作为参数传递 什么是函数内嵌 请参考我之前写的博客函数简介 因为在python里面 函数也是对象 也可以作为参数进行传递 python装饰器本质也是一种特殊函数 它接收的参数是函数对象 然后动态地函数参数添
  • python装饰器详解-python装饰器的详细解析

    什么是装饰器 xff1f python装饰器 xff08 fuctional decorators xff09 就是用于拓展原来函数功能的一种函数 xff0c 目的是在不改变原函数名 或类名 的情况下 xff0c 给函数增加新的功能 这个函
  • 安装oracle出现环境不满足最低要求

    安装win64 11gR2 database 1of2的时候出现这个 xff0c 百度了下解决方法 在oracle安装包找到stage文件夹 然后找到cvu 然后在cvu里面找到cvu prereq xff0c 用记事本打开 增加以下内容
  • mybatis的优缺点

    优点 xff1a 1 基于SQL语法 xff0c 简单易学 2 能了解底层组装过程 3 SQL语句封装在配置文件中 xff0c 便于统一管理与维护 xff0c 降低了程序的耦合度 4 程序调试方便 5 与传统JDBC比较较少了大量的代码量

随机推荐

  • Eclipse打不开,提示查看Log文件

    今天在使用Eclipse的时候 xff0c Eclipse整个黑屏 xff0c 然后果断启动任务管理器 xff0c 关掉了Eclipse然后重启 xff0c 发现Eclipse打不开了 xff0c 然后提示查看log文件 xff0c 然后解
  • equals的用法的注意事项

    String a 61 34 equals的用法 34 String b 61 a equals 34 equals的用法 34 34 相等 34 34 不相等 34 这样的用法有隐患 xff0c 当传入的参数a是空值的时候 xff0c 程
  • svnE175002、E160024以及提交冲突解决方法

    E17005与Eclipse代理有关 xff0c 将代理勾选掉 xff0c 把active provider 改为Direct 即可 E160024 是以为有的文件过期了 xff0c 右键更新即可 最后 xff0c svn代码提交冲突的时候
  • break和continue的区别

    1 一般的continue会退回最内层循环的开头 xff08 并继续执行 xff09 2 带标签的continue会到达标签的位置 xff0c 并重新进入紧接在那个标签后面的循环 3 一般的break会中断并跳出当前循环 4 带标签的bre
  • samba服务常用命令

    sudo vim etc samba smb conf 里增添用户 span class token punctuation span bsp span class token punctuation span comment span c
  • 用mac进行图片的自由裁剪

    用mac上自带的图片预览工具 xff0c 即可完成对图片的自由裁剪
  • WEB项目部署到Linux下无法访问html、css、js等静态文件的解决

    WEB项目 xff0c 在自己本机 xff08 windows xff09 下通过Tomcat访问 一切正常 部署到Linux下的Tomcat 进行访问 除了 do接口和jsp页面能访问外 其他的都不能访问 原因 xff1a 默认80端口
  • Java规范的三种注释方式

    在学习开发中药养成良好的编码习惯 xff0c 规整的代码格式会为程序日后的维护工作提供便利 在此对编码规则做了以下总结 xff1a 1 每条语句尽量单独占一行 xff0c 每条语句都要以分号结束 xff1b 2 在声明变量时 xff0c 尽
  • Tensorflow2.5安装(安装问题,这一篇全解决)

    恭喜你发现全网最简单最详细的Tensorflow安装教程 xff01 本文将给出2 5版本的具体配置 xff0c 若要安装其他版本也可参照本文的思路 与过去版本对比 xff0c 你可以感受到来自Tensorflow2 5的善意 xff1a
  • linux嵌入式arm基础笔记5之录音与播放

    1 粤嵌GEC6818开发板介绍 http www gec lab com arm show 72 html 2 粤嵌GEC6818平台介绍及其开发板配置 操作系统 心若十年的博客 CSDN博客 https blog csdn net qq
  • C++应用之线程池ThreadPool

    include 34 ThreadPool h 34 include 34 StopWatch h 34 include lt thread gt include lt chrono gt include lt iostream gt vo
  • Centeros最小化安装后很多常用命令无法使用(一键安装linux常用命令)

    运行如下命令立即解决问题 最小化安装系统后还会有一些基本的工具没装 xff0c 可采用yum方式批量安装 xff0c 也可以使用哪个安装哪个 yum y install wget setuptool system config firewa
  • 【从零开始的SDN学习之路】之闲话Neutron与SDN的联系

    闲话Neutron与SDN的联系 前言一 OpenStack中的网络发展二 Neutron是不是SDN xff1f 前言 OpenStack作为当前最富盛名的云计算管理工具 xff0c 其服务覆盖了网络 虚拟化 操作系统 服务器等各个方面
  • ESP8266(ESP模块)Arduino开发环境快速搭建方法--含网盘离线文件

    目录 1 ESP8266简介 1 1 乐鑫ESP8266 1 2 安信可ESP模组 2 ESP8266开发 3 开发环境搭建 4 网盘文件离线安装 1 ESP8266简介 1 1 乐鑫ESP8266 乐鑫公司的提供的ESP8266 系列模组
  • 解决Ubuntu虚拟机地无法上网问题

    虚拟机软件 xff1a VMware xff0c 操作系统 xff1a Ubuntu20 04 1 笔者安装好Unbutu20 04 1的虚拟机之后一直遇到一个问题 xff0c 网络图标不显示 xff0c 网络也不可用 每次都要把 虚拟网络
  • python中wraps的详解

    1 name 用来显示函数的名称 xff0c doc 用来显示文档字符串也就是 34 34 文档字符串 34 34 这里面的内容 2 首先我们来看不加 64 wraps的例子 span class token keyword def spa
  • 读书笔记-深度学习推荐系统1-概述章节

    推荐系统充斥于互联网的各个角落 xff0c 听音乐 看视频 看新闻 购物 学习课程等等 1 1 推荐系统的作用 用户 xff1a 在信息过载的情况下 xff0c 帮助用户高效获得感兴趣的信息 公司 xff1a 通过推荐吸引用户留存 增加用户
  • C++算法之——常用算法总结

    基本的C 43 43 算法分为三类 xff1a 排序算法 树算法 图算法 算法思想有三种 xff1a 递推 分治 动态规划 以及 贪心算法 本文将简要介绍上面三类算法 xff0c 介绍时穿插介绍算法思想 一 排序算法 1 基本O n 2 排
  • xfs 文件系统的备份和恢复(包含磁盘挂载)

    一 xfs文件系统备份简介 XFS 提供了 xfsdump 和 xfsrestore 工具协助备份 XFS 文件系统中的数据 xfsdump 按 inode顺序备份一个 XFS 文件系统 centos7 开始选择 xfs 格式作为默认文件系
  • 正则的基本用法

    一 了解正则表达式 正则表达式是对字符串操作的一种逻辑公式 xff0c 就是用事先定义好的一些特定字符 及这些特定字符的组合 xff0c 组成一个 规则字符串 xff0c 这个 规则字符串 用来表达对字符串的一种过滤逻辑 正则表达式是用来匹