正则表达式

正则表达式

分类

BRE:基本正则表达式,grepsedvi等软件支持,vim有扩展

ERE:扩展正则表达式,egrepgrep -E sed  r

PCRE:几乎所有的高级语言都是PCRE的方言或则变种,

基本语法

元字符metacharater

.  匹配除换行符外任意一个字符

[abc]字符集合,只能表示一个字符的位置,匹配所包含的任意一个字符,[abc]匹配plaina

[^abc] 字符集合,只能表示一个字符的位置。匹配除集合内的。

[a-z]字符范围,也是个集合,表示一个字符位置,匹配所包含的任意一个字符

[^a-z]字符范围,除去集合所包含的

\b单词的边界 \bb在文本中找到单词b开头的b字符

\B不匹配单词的边界,

\d 匹配一位0-9的数字

\D匹配一位0-9非数字

\s匹配一位空白字符[\f\r\t\n\v]

\S匹配一位非空白字符

\w匹配[0-9A-Za-z]包括中文字符

\W匹配除\w之外的字符

转义

凡是在正则表达式中油特殊含义的符号,如果想使用它的本意,请使用\转义。反斜线自身得使用\\

\r\n还是转义后代表回车换行

重复

*表示前面的正则表达式会重复0次:e\w*单词中e后面可以有非空白字符

+表示前面的正则表达式至少重复一次:e\w+单词中e后面只至少有一个非空白字符

?表示前面的正则表达式会重复0次或则一次:e\w? 单词中e后面至多有一个非空白字符

{n}重复固定的n次:

{n,}至少重复n

{n,m}重复nm

X|y  匹配x或者y

(pattern) 使用小括号指定一个子表达式,也叫分组,可以改变优先级

\数字  匹配对应的分组

(?:pattern)如果仅仅为了了改变优先级,就不需要分组

(?<name>exp)(?’name’exp)分组捕获,但是可以通过name访问分组Python语法必须是(?<name>exp

(?=exp)零宽度正预测先行断言,断言exp一定在匹配的右边出现,也就是说断言后边一定跟个exp

零宽度正回顾后发断言,断言exp一定出现在匹配的左边出现,也就是说前面一定有个exp前缀

(?!exp)零宽度负预测先行断言,断言exp一定不会出现在右侧,也就是说断言后面一定不会出现exp

(?<!exp)零宽度负回顾后发断言,断言exp一定不能出现在左侧,也就是说断言前面一定不能是exp

(?#comment) 注释 f(?=00)(?#这个后断言不捕获)

注意:

断言会不会捕获呢?也就是断言会不会占用分组号呢

断言不会占用分组号,断言如同条件,只是要求匹配必须瞒足断言的条件

 

分组和捕获不是同一个意思

使用正则表达式,能用简单表达式,就不要用复杂的表达式

 

贪婪豫非贪婪

默认是贪婪模式,也就是说尽量匹配更长的子串

非贪婪很简单,再重复的符号后面加上一个?就尽量的少匹配了

引擎选项

Ignorecase 匹配时忽略大小写 re.l

Singleline 单行模式。可以匹配所有字符,包括\n re.S

Multiline 多行模式^行首 $行尾 re.M

lgnorePatternwhitespace 忽略表示中的空白字符,如果要使用空白字符,如果要是用空白字符用转义,#可以用来做注释 re.X

编译

re.compile(pattern,flags=0)

设定flags,编译模式,返回正则表达式对象regex

Pattern就是正则表达式字符串,flags是选项,正则表达式需要被编译,为了提高效率,这些编译后的结果被保存,下次使用同样的pattern的时候,就不需要再次编译。

re的其他方法为了提高效率调用的编译方法。就是为了提速

Re.match(pattern,string,flags=0)

match匹配从字符串的开头匹配,regex对象match方法可以重设定开始位置和结束位置。返回match对象

re.search(pattern,string,flags=0)

从开头搜索直到第一个匹配,reges对象search方法可以重设开始位置和结束位置,返回match对象

re.fullmatch(pattern.string,flags=0)

Regex.fullmatch(string[,pos[,endpos]])

整个字符串和正则表达式匹配

re.findall(pattren,string,flags=0)

Regex.findall(string[,pos[,endpos]])

对整个字符串,从左到右匹配,返回所有匹配项的列表

re.finditer(pattren.string,flags=0)

Regex.finditer(string,[,pos[,endpos]])

对整个字符串,从左至右匹配,返回所有的匹配项,返回迭代器

注意每次迭代返回的是match对象。

re.sub(pattern,replacement,string,count=0,flags=0)

Regex.sub(replacement,string,count=0)

使用pattern对字符串string进行匹配,对匹配选项使用repl替换,可以是子串,寒素,bytes

分割字符串

字符串的分割函数,太难用,不能指定多个字符串进行分割

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

re.split分割字符串

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/97675

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code