正则表达式

##**正则表达式**
– 正则表达式是文本处理极为重要的技术,用它可以对字符串按照某种规则进行检索、替换
– 分类:
– BRE:基本正则表达式,grep sed vi等软件支持。vim有扩展
– ERE:扩展正则表达式,egrep(grep -E) sed -r等
– PCRE:几乎所有高级语言都是PCRE的方言或者变种。

##**基础语法**
– “.” : 匹配除换行符外任意一个字符
– [abc] : 字符集合,匹配所包含的任意一个字符
– [^abc] : 字符集合,只能表示一个字符位置。匹配除去集合内字符的任意一个字符
– [^a-z] : 字符范围,也是集合,表示一个字符位置,匹配除去集合内字符的任意一个字符
– \b : 匹配单词的边界 举例:\bb在文本中找到单词b开头的b字符
– \B : 不匹配单词的边界 举例:t\B 包含t但不以t结尾,如write; \Bb不以b开头的含有b的单词,例如able
– \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次 |e\w+ 单词e后面至少有一个非空白字符
| ? |重复0或1次 |e\w? 单词e后至多有一个非空白字符
| {n} |重复固定的n次 |e\w{1} 单词中e后面只能有一个非空白字符
| {n,} |重复至少n次 |
| {n,m} |重复n到m次 |e\w{1,10}单词中e后面至少1个,至多10个
| x丨y |匹配x或者y |(w丨f)ood
| 捕获 |(pattern) |捕获后分配组号从1开始
| \数字 |匹配对应的分组 |(very) \1 匹配very very,捕获的组group是very
| (?:pattern) |如果改变优先级就不需要捕获分组 |(?:w丨f)ood
|(?<name>exp) |分组捕获,通过\name访问分组 |
| (?=exp) |断言exp一定在右边出现 |f(?=oo) f后面一定有oo出现
| (?<=exp) |exp左边一定出现 |
| (?!exp) |断言后面一定不是exp |\d{3}(?!\d) 3个数字后面一定不是数字
| (?<!exp) |断言exp一定不再左边出现 |(?<!f)ood 就是ood左边一定不是f
| (?#comment) |注释 |f(?=oo)(?#这个后断言不捕获)

##**贪婪与非贪婪**
– 默认是贪婪模式,也就是说尽量多匹配更长的字符串
– 非贪婪模式在重复的符号后面加上一个?问号,变少匹配了
| 代码 | 说明 | 举例 |
| :————-|:——————————|:—————————–|
| *? |匹配任意次,尽可能少重复 |
| +? |匹配至少1次,但尽可能少重复 |
| ?? |匹配0次或1次,少重复 |
| {n,}? {n,m}? |少重复

##**练习**
1.匹配手机号码:
\d{11}
2.匹配座机
\d{3,4}-\d{7,8}
3.匹配0-999之间的数字
一位数:\d 两位数:[1-9]?\d 三位数:^([1-9]\d\d?|\d)\r?$
4.匹配ip地址 0.0.0.0 – 255.255.255.255
(?:([01]?\d\d?|25[0-5]|2[0-4]\d)\.){3}([01]?\d\d?|25[0-5]|2[0-4]\d)

##**python的正则表达式**
– **常量**
– re.M re.MULTILINE 多行模式
– re.S re.DOTALL 单行模式
– re.I re.IGNORECASE 忽略大小写
– re.X re.VERBOSE 忽略表达式中的空白字符

– **编译**
– re.compile(pattern,flags=0) #flags如 re.I re.M re.S
– 设定flags,编译模式,返回正则表达式对象regex
– pattern是正则表达式字符串,flags是选项。正则表达式需要被编译,结果保存,下次便不需要再编译
– 单次匹配(match)
– re.match(pattern,string,flags=0)
– regex.match(string[,pos[,endpos]])
– match是从字符串开头匹配,regex对象match方法可以重设定开始位置和结束位置。
– 单次匹配(search)
– re.search(pattern,string,flags=0)
– regex.search(string[,pos[,endpos]])
– 从头搜索直到第一个匹配,regex对象search方法可以重设定开始位置和结束位置,返回match对象
– 单次匹配(fullmatch)
– re.fullmatch(pattern,string,flags=0)
– regex.fullmatch(string[,pos[,endpos]])
– 整个字符串和正则表达式匹配
– 全部匹配(findall)
– re.findall(pattern,string,flags=0)
– regex.findall(string[,pos[,endpos]])
– 对整个字符从左至右匹配,返回所有匹配项的**列表**
– 全部匹配(finditer)
– re.finditer(pattern,string,flags=0)
– regex.finditer(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_subs_made) number_of_subs_made指替换次数

– 分割字符串
– re.split(pattern,string,maxsplit=0,flags=0) 返回一个分割后的列表
##例子
import re
s = ”’01 bottle
02 bag
03 big1
100 able”’
result = re.split(‘[\s\d]+’,s)
print(result) #[”,’bottle’,’big’,’able’]

regex = re.compile(‘^[\s\d]+’,re.M)
result = regex.split(s)
print(result) #[”,’bottle\n’,’bag\n’,’big1\n’,’able’]

##**分组**
– 使用小括号的pattern捕获的数据被放到了组group中
– match、search函数可以返回match对象;findall返回字符串列表;finditer返回一个个match对象
###练习
import re
s = ”’bottle\nbag\nbig\napple”’
regex = re.compile(‘(b\w+)\n(?P<name2>b\w+)\n(?P<name3>b\w+)’)
result = regex.match(s)
print(result.groups()) (‘bottle’,’bag’,’big’)
print(result.group(0)) ‘bottle\nbag\nbig’
print(result.group(1)) ‘bottle’
print(result.group(2)) ‘bag’
print(result.groupdict()) {‘name2′:bag,’name3’:big}
print(result.group(‘name2’)) ‘bag’

 

 

 

 

 

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

(0)
miraclermiracler
上一篇 2017-11-07 09:33
下一篇 2017-11-08 18:45

相关推荐

  • linux三剑客之grep

    linux三剑客之grep        所谓三剑客的工具有“grep”、“sed” 、“awk”,他们都是不谋而合的文本搜索查找处理的强大工具。grep 是 Ken Thompson 写的,他也是 Unix 的创造者。 gerp及正则表达式    grep全称(GLobal search Regu…

    Linux干货 2016-08-08
  • 详解LVM逻辑卷

       LVM逻辑卷管理 当os6中partprobe 命令不能同步分区完的分区信息,及用ll /dev/sd*、cat /proc/partation、lsblk看的设备分区内容和用fdisk -l 看到的信息不同步 所以用partx -a 设备名或者用partx -a –nr 分区号 设备名 其中表示n是设备名,r 是ran…

    Linux干货 2016-08-29
  • N25-第三周作业

    1.列出当前系统所有已经登录的用户的用户名,注意同一个用户登录多次,只显示一次即可   who | cut -d" " -f1 |uniq 2.取出最后登录到当前系统的用户的相关信息    w | tail -1 3.取出当前系统上被用户当做其默认shell最多的那个shell &nbsp…

    Linux干货 2016-12-19
  • 上篇博客简单提了一下Nginx配置文件的大体组成部分,这次来好好解释一下这些个配置文件。 一、main配置段 分类:    正常运行必备的配置    优化性能相关的配置    用于调试及定位问题相关的配置   …

    Linux干货 2016-10-26
  • Linux终端类型

      2016-10-16  19:29:36  Linux终端类型   基本概念:  Linux终端其实就是用户与操作系统之间的一个接口,用户通过终端与操作系统进行交互。 在Linux系统终端包括以下几种: 1、控制台终端(Terminal)它的文件路径(/dev/console) (物理终端直接连接键盘和鼠…

    Linux干货 2016-10-17
  • yum 仓库

    Yum 仓库     yum源就是一个软件集合地,你只需要搜索并安装你想要的软件,它会帮你解决大部分软件的依赖问题。本地源比如说光盘里面一般会附带一些软件,这个时候就可以把光盘当成本地源来安装软件。网络源比如说aliyun的镜像网站,这就属于网络源,可以通过互联网把软件下载下来并安装。   yum 仓库 &n…

    2017-06-24