正则表达式

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

相关推荐

  • 马哥教育网络班21期-第一次课程作业

    计算机组成部分及其作用 1.总线 电子管道,携带信息字节并在各个部件间传输。分为地址总线,数据总线,控制总线。 CPU最大可寻址范围:2^N*M,  N为地址总线数量,M为数据总线数量。 2.I/O设备 I/O设备及输入输出设备,最常见的输入设备就是我们非常熟悉的键盘,鼠标,我们通过我们通过这些设备向计算机传达指令,让计算机完成我们想要它完成的工作…

    Linux干货 2016-06-29
  • 马哥教育网络20期+第二周练习博客

    1、 Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 ls 使用方式:ls [OPTION]… [DIR]… 常用选项: -a:显示所有档案及目录;  -A:显示除影藏文件“.”和“..”以外的所有文件列表; -C:多列显示输出结果。这是默认选项;  -l:与“-C”选项功能相反,所有输出…

    Linux干货 2016-06-23
  • DNS服务器搭建示例

    DNS服务器搭建示例 负责解析magedu.com域名,能够对一些主机名进行正向解析和逆向解析 配置主配置文件 [root@slave1 etc]# vim /etc/named.conf options { listen-on port 53 { 192.168.91.132; }; // listen-on-v6 port 53 { ::1; }; di…

    2017-09-16
  • centos系列初步搭建LAMP

    centos6搭建LAMP 系统环境 ip=192.168.0.105 selinux为:setenforce 0 iptables 为stop 客户机需要修改hosts文件 1.192.168.2.105 www1.stuX.com2.192.168.2.105 www2.stuX.com 安装LAMP组件 1.yum install …

    Linux干货 2016-12-11
  • Linux基础知识(四)

    本文主要讲述:Linux上用户和组的基本管理,具体包括一下内容 1、复制/etc/skel目录到/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 2、编辑/etc/group文件,添加组hadoop。 3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id…

    Linux干货 2016-10-16
  • 网络管理

    网络概念 网络应用程序 Web 浏览器(Chrome、IE、Firefox等) 即时消息(QQ、微信、钉钉等) 电子邮件(Outlook、foxmail 等) 协作(视频会议、VNC、Netmeeting、WebEx 等) web网络服务(apache,nginx,IIS) 文件网络服务(ftp,nfs,samba) 数据库服务( MySQL,MariaDB…

    Linux干货 2017-05-06