正则表达式

##**正则表达式**
– 正则表达式是文本处理极为重要的技术,用它可以对字符串按照某种规则进行检索、替换
– 分类:
– 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、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ~]# who | cut -d "" -f1 |uniq root     pts/0        2016-11-13 12:17 (172.16.220.14) 2、取出最后登录到…

    Linux干货 2016-11-16
  • PHP5.4的变化关注—What has changed in PHP 5.4.x

    What has changed in PHP 5.4.x Most improvements in PHP 5.4.x have no impact on existing code. There are a few incompatibilities and new features that should be …

    Linux干货 2015-06-17
  • ​文件共享服务之FTP

    文件共享服务之FTP 文件共享服务之FTP 一、什么是文件共享服务 二、FTP 三、响应码 四、FTP存储和mysql存储有什么不同? 五、用户认证 六、FTP安装与配置 一、什么是文件共享服务 简单理解就是文件或存储块设备可以共享给大家使用。  1、实现共享服务有三种! (1)ftp:属于应用层服务,可以跨平台使用(linux<—&gt…

    Linux干货 2016-04-18
  • 重定向和管道

    重定向和管道 今天一起来学习一下重定向的一些相关命令及用法: 我们都知道程序=指令+数据 ,那么我们的数据的输入(Input)和输出(Output)是如何实现的呢?!跟小编君一起来看一下吧: 本博文小编君分成了四部分:1.重定向的讲解 2.管道符的讲解 3.涉及到的一些其他命令 4.练习题 一:重定向 重定向的本质是改变文件的默认位置,即换个地方存储数据。 …

    2017-08-04
  • LVS 之 初识LVS

    LVS 之 初识LVS LVS 之 初识LVS 0x00 概述 0x01 LVS拓扑结构图: lvs集群类型中的术语 : 0x02 lvs-type lvs-nat lvs-dr lvs-tun lvs-fullnat : 0x03 调度算法(scheduler) 0x00 概述 LVS : Linux Virtual Server lvs 工作在 IOS …

    2017-05-11
  • LAMP运行环境搭建及部署php程序软件

    前言     Linux+Apache+MySQL+PHP是大多数web服务器的运行环境,能熟练配置此运行环境是每个运维的必备基本技能,本文以安装MySQL管理工具PHPmyadmin以及博客软件wordpress为例,演示编译安装LAMP运行环境的过程。 一、实验拓扑图 二、安装步骤 2.1 编译安装Apache h…

    2015-11-26