正则
概述:
分类:
- BRE:基本正则表达式,grep sed vi等软件支持。vim有扩展
- ERE:扩展正则表达式,egrep(grep -E)、sed -r等
- PCRE:几乎所有高级语言都是PCRE的方言或变种。python从1.6开始使用SRE正则表达式引擎,可以认为是PCRE的子集,见模块re
基本语法
元字符
- . 匹配除换行符外任意一个字符
- [abc]:字符集合,只能表示一个字符的位置,匹配所有包含的任意一个字符:[abc]匹配plain中的‘a’
- [^abc]:字符集合,只能表示一个字符的位置,匹配除去集合内字符的任意一个字符:[abc]匹配plain中的‘p’、‘l’、‘i’、‘n’
- [a-z]:字符范围,也是一个集合,表示一个字符位置,匹配所包含的任意一个字符
- [^a-z]:匹配除去集合内字符的任意一个字符
- \b:匹配单词的边界:\bb在文本中找到单词b开头的b字符
- \B:不匹配单词的边界:t\B包含t的单词但是不以t结尾的t字符,如write
- \d:[0-9]匹配一位数字
- \D:[^0-9]匹配一位非数字
- \s:匹配1位空白字符,包括换行符、制表符、空格
- \S:匹配1位非空白字符
- \w:匹配[a-zA-Z0-9_],包括中文的字
- \W:匹配\w之外的字符
单行模式:.可以匹配所有字符,包括换行符^表示整个字符串的开始,$表示整个字符串的结尾。开始指的是\n后紧接着下一个字符,结束指的是/n前的字符
- 转义:凡是在正则表达式中有特殊意义的符号,如果想使用它的本意,请使用\转义。反斜杠自身,则使用\。\r,\n还是转义后代表回车换行
重复
- * :表示前面的正则表达式会重复0次或多次:e\w*单词中有e然后后面非空白字符
- +:表示前面的正则表达式重复至少1次
- ?:表示前面的正则表达式会重复0次或1次
- {n}:重复固定n次
- {n,}:重复至少n次 {1,}等价于+ | {0,}等价于啊* | {0,1}等价于?
- {n,m}:重复n到m次
- x|y:匹配x或者y
- 捕获:
- (pattern):使用小扩号指定一个子表达式,也叫分组。捕获后会自动分配组从1开始可以改变优先级
- \数字:匹配对应分组
- (?:pattern):如果仅仅为了改变优先级,就不需要捕获分组
- (?\<name\>exp)、(?’name’exp):分组捕获,但是可以name访问分组python语法必须是(?P\<name\>exp)
- 零宽断言
- (?=exp):断言exp一定在匹配的右边出现,也就是说断言后面一定跟一个exp:f(?=oo)f后面一定有oo出现
- (?<=exp):断言exp一定出现在匹配的左边,也就是说前面一定有个exp前缀:(?<=f)ood,ood前一定有f出现
- 负向零宽断言:
- (?!exp):断言exp一定不会出现在右侧,也就是说断言后面一定不是exp
- (?>!exp):断言exp一定不能出现在左侧,也及时说断言前面一定不能是exp:(?<!f)ood ood的左边一定不是f</li>
- (?#comment):注释 例如:f(?=oo)(?#这个后断言不捕获)
分组和捕获是同一个意思,能用简单表达式,就不要用复杂的表达式
贪婪与非贪婪
- 默认是贪婪模式,也就是说尽量匹配更长的字符串
- 非贪婪模式很简单,在重复的符号后面加一个?问好,就是尽量少匹配了
- *?:匹配任意次,但尽可能少重复
- +?:匹配至少一次,但尽可能少重复
- ??:匹配0次或一次,但尽可能少重复
- {n,}?:匹配至少n次,但尽可能少重复
- {n,m}?:匹配至少n次,至多m次,但尽可能少重复
- 引擎选项:
- IgnoreCase:匹配时忽略大小写。re.l/re.IGNORECASE
- Singleline:单行模式:.可以匹配所有字符,包括\n。re.S/re.DOTALL
- Multiline:多行模式:^行首、$行尾。re.M/re.MULTILINE
- IgnorePatternWhitespace:忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来左注释。re.X/re.VERBOSE
练习:
Python的正则表达式
- Python使用re模块提供了正则表达式处理的能力
- 常量:
- re.M/re.MULTLINE:多行模式
- re.S/re.DOTALL:单行模式
- re.l/re.IGNORECASE:忽略大小写
- re.X/re.VERBOSE:忽略表达式中的空白字符
- 使用|位或运算开启多种选项
- 方法:
- 编译:
- re.compile(pattern,flags=0)
- 设定flags,编译模式,返回正则表达式对象regex
- pattern就是正则表达式字符串,flags是选项。正则表达式需要被编译,为了提高效率,这些编译后的结果被保存,下次使用同样的pattern的时候,就不需要再次编译。
- re的其他方法为了提高效率都调用了编译方法,就是为了提速
单次匹配:
- re.match(pattern,string,flags=0)
- regex.match(string,pos[,endpos])
- match匹配从字符串的开头匹配,regex对象match方法可以重设定开始位置和结束位置。返回match对象
- re.search(pattern,string,flags=0)
- regex.search(string[,pos[,endpos]])
- 从头搜索直到第一个匹配,regex对象search方法可以重设定开始位置和结束位置,返回match对象
- re.fullmatch(pattern,string,flags=0)
- regex.fullmatch(string[,pos[,endpos]])
- 整个字符串和正则表达式匹配
- 编译:
- re.sub(pattern,replacement,string,count=0,flags=0)
- regex.sub(replacement,string,count=0)
- 使用pattern对字符串string进行匹配,对匹配项使用repl替换
- replacement可以是string、bytes、function
- re.subn(pattern,replacement,string,count=0,flags=0)
- regex.subn(replacement,string,count=0)
- 同sub返回一个元组(new_string,number_of_sub_made)
字符串分割函数劣势:不能指定多个字符串进行分割
- re.split(pattern,string,maxsplit=0,flags=0)
- re.split分割字符串
- 使用小扩号的pattrn捕获的数据被放到了组group中
- match、search函数可以返回match对象;findall返回字符串列表;finditer返回一个个match对象
- 如果pattern中使用了分组,如果有匹配结果,会在match对象中
- 1.使用group(N)方式返回对应分组,1-N是对应的分组,0返回整个匹配的字符串
- 2.如果使用了命名分组,可以使用group(‘name’)的方式取分组
- 3.也可以使用groups()返回所有分组
- 4.使用groupdict()返回所有命名的分组
作业:(红色标记未完成)
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88239
评论列表(1条)
朋友,你看的是多少期的内容?怎么会有这么多的知识呢?