正则表达式

##**正则表达式**
– 正则表达式是文本处理极为重要的技术,用它可以对字符串按照某种规则进行检索、替换
– 分类:
– 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

相关推荐

  • 逻辑卷LVM

    逻辑卷LVM 简介     在实际生产应用中,磁盘的分区的容量是固定不变的,当出现分区容量不足的情况,除了新加磁盘,还有没有其他方法呢?    逻辑卷(LVM)的概念就出现了,全称叫Logical Volume Manager。它的作用是允许对卷进行方便操作的抽象层,包括重新设定…

    Linux干货 2017-08-12
  • LVM2 ( Blog4 )

    LV基本应用,扩展及缩减实现

    Linux干货 2017-11-27
  • 磁盘文件挂载与卸载

    挂载(mount)何为挂载?挂载指将文件系统与根文件系统的某个现存的目录建立起来的关联关系,这样我们就可以将目录作为访问磁盘文件的入口,进行存取交互。挂载点:挂载点指的是被挂载的对象,通常挂载点是一个目录,不过有时候也有文件作为挂载点格式:mount 设备 挂载点 ;此挂载方法味临时挂载,只在当前的shell中有效,退出则清除挂载关联设备文件在/dev/sd…

    Linux干货 2017-04-24
  • 8月2日作业

    1、在/testdir/data里创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。 答: ~]# groupadd g1 ~]# groupadd g2 ~]# groupadd g3 ~]# useradd -G g2 alic…

    Linux干货 2016-08-04
  • Linux基础知识之根下各目录的介绍

    /bin  :所有用户使用的基本用户命令文件,二进制格式的 /sbin :供系统管理使用的工具程序 /boot :引导加载器必须用到的各静态文件:kernel initramfs(initrd),grub /dev  :存储特殊文件或设备文件;设备的类型:字符设备,块设备; /etc  :系统程序的静态配置文件,只能为静态的不能…

    Linux干货 2016-07-10
  • linux开机启动流程

    linux开机启动流程:   一、BIOS 加电自检 当你按电源开关开机时,电脑会首先去启动BIOS(基本输入输出系统),BIOS一般是集成在主板上的. BIOS 的工作 1.检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统 2.寻找启动磁盘,每一种BIOS都会有开机启动菜…

    Linux干货 2016-09-14