正则表达式

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

相关推荐

  • 加密的应用

    加密的应用 一、实现对称加密 1、openssl enc man enc 算法:3des, aes, blowfish, twofish 加密操作:openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher 解密操作:openssl enc  -d -des3 -a  -…

    Linux干货 2016-09-26
  • Linux任务计划,周期性任务执行详解

    Linux任务计划,周期性任务执行 概述 本章将为大家介绍一些任务计划和周期性任务计划执行相关内容任务计划的分类主要有由两种    未来的某时间点执行一次某任务:at,batch    周期性运行某任务:crontab具体分为三个方面来说明:    1、at计划任务    2、c…

    Linux干货 2016-09-27
  • linux 文件管理命令

    目录与路径    1.相对路径与绝对路径 因为我们在Linux系统中,常常要涉及到目录的切换,所以我们必须要了解 "路径" 以及 "相对路径" 与 "绝对路径" 的概念。在之前的学习中,就反复的强调了Linux的目录是 "树状目录" 。假设我们需要在任意一个目…

    Linux干货 2016-11-06
  • 用vsftpd来搭建网络yum源

    1、分别在CentOS6和CentOS7分别搭建网络yum源 a、CentOS 7中 首先安装并启用vsftpd服务 [root@node1 ~]# mount /dev/cdrom /mnt/yum/ [root@node1 ~]# vim /etc/yum.repos.d/local.repo [local] name=local baseurl=fil…

    2015-10-03
  • systemd

    systemd 启动流程:POST -> BIOS -> MBR bootloader -> kernel 临时根 -> 根文件系统 -> init init 能够管理、控制init进程的模块,就是init系统 能够让系统在用户预定义的级别下运行 设备管理器: sysvinit : CentOS 5 第一个广泛应用的init系统…

    Linux干货 2017-05-21
  • Jerry首作_linux基础

    一、计算机的组成及其功能 硬件 冯·洛伊曼体系 控制器(Control):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。 运算器(Datapath):运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。 存储器(Memory):存储器的功能是…

    Linux干货 2016-10-25