赞
踩
正则表达式,Regular Expression,缩写为regex、regexp、RE等。
正则表达式是文本处理极其重要的技术,用它可以对字符串按照某种规则进行检索、替换。
正则表达式应用及其广泛,shell中处理文本的命令、各种高级编程语言都支持正则表达式。
1、BRE:正则表达式,grep、sed、vi等软件支持。vim有扩展
2、ERE:扩展正则表达式,egrep(grep-E)、sed-r等
3、PCRE:几乎所有高级语言都是PCRE的方言或者变种。Python1.6开始使用SRE正则表达式引擎,可以认为是PCRE的子集。
元字符metacharacter
代码 | 说明 | 举例 |
---|---|---|
. | 匹配除换行符外任意一个字符 | . |
[abc] | 字符集合,只能表示一个字符位置。匹配所包含的任意一个字符 | [abc]匹配plain中的‘a’ |
[^abc] | 字符集合,只能表示一个字符位置。匹配除去集合内字符的任意一个字符 | [^abc]可以匹配plain中的‘p’、‘l’、‘i’或者’n’ |
a-z | 字符范围,也是个集合,表示一个字符位置匹配所包含的任意一个字符 | 常用A-Z[0-9 |
[^a-z] | 字符范围,也是个集合,表示一个字符位置匹配集合内字符的任意一个字符 | |
\b | 匹配单词的边界 | \b b在文本中找到单词中b开头的b字符 |
\B | 不匹配单词的边界 | t\B包含t的单词但是不以t结尾的t字符 |
\d | [0-9]匹配一位数字 | \d |
\D | [^0-9]匹配1位非数字 | |
\s | 匹配1位空白字符,包括换行符、制表符、空格[\f\r\n\t\v] | |
\S | 匹配1位非空字符 | |
\w | 匹配[a-zA-Z0-9] | \w |
\W | 匹配\w之外的字符 |
详细分析
凡是在正则表达式中有特殊意义的符号,如果想使用它的本意,需要转义,反斜杠自身,需要使用\
\r和\n转义后还是代表回车、换行
代码 | 说明 | 举例 |
---|---|---|
* | 表示前面的正则表达式会重复出现0次或多次 | e\w*单词中e后面可以有非空白字符 |
+ | 表示前面的正则表达式重复至少1次 | e\w单词后面至少有一个非空白字符 |
? | 表示前面的正则表达式会重复0次或1次 | e\w?单词中e后面至多有一个非空白字符 |
{n} | 重复固定的n次 | e\w{1} 单词中e后面只能有一个非空白字符 |
{n,} | 重复至少n次 | e\w{1,}等价于e\w+,e\w{0,}等价e\w*,e\w{0,1}等价e\w? |
{n,m} | 重复n到m次 | e\w{1,10}单词中e后面至少1个,至多10个非空白字符 |
代码 | 说明 | 举例 |
---|---|---|
x | y | 匹配x或者y |
捕获 | ||
(pattern) | 使用小括号指定一个子表达式,也叫分组捕获后会自动分配组号从1开始可以改变优先级 |
组号默认从1开始,分组0指的是匹配分组
(?:pattern) | 如果仅仅为了改变优先级,就不需要捕获分组 | (?:w | f)ood ‘industr(?:y | ies)等价于’industry | industries’ |
---|
\数字 | 匹配对应的分组 |
---|
后面的\1代表复制group1的游戏
将\1变为\2后
|(?:exp)
(?'name’exp) | 命名分组捕获,但是可以通过name访问分组,Python语法必须是(?Pexp) |
---|
将分组进行命名
零宽断言 | |
---|---|
(?=exp) | 零宽度正预测先行断言,断言exp一定在匹配的右边出席那,也就是说断言后面一定跟个exp |
(?<=exp) | 零宽度正回顾后发断言,断言exp一定出席那在匹配的左边出现,也就是前面一定有个exp前缀 |
---|
负向零宽断言 | |
---|---|
(?!exp) | 零宽度负预测先行断言,断言exp一定不会出现在右侧,也就说断言后面一定不是exp |
|(?<!exp) |零宽度负回顾后发断言,断言exp一定不能出现在左侧,也就是说断言前面一定不能是exp |
注意:
断言会不会i捕获呢?也就是断言占不占分组符
断言不沾分组号,断言部分不会出现在分组中
分组和捕获是同一个意思
使用正则表达式时,能用简单表达式,就不要复杂的表达式
默认是贪婪模式,也就是说尽量多匹配更长的字符串
非贪婪很简单,在重复的符号后面加一个?问号,就尽可能的少匹配了
代码 | 说明 |
---|---|
*? | 匹配任意次,但尽可能少重复 |
+? | 匹配至少1次,但尽可能少重复 |
?? | 匹配0次或1次,但尽可能少重复 |
{n,}? | 匹配至少n次,但尽可能少重复 |
{n,m} | 匹配至少n次,至多m次,但尽可能少重复 |
代码 | 说明 | python |
---|---|---|
IgnoreCase | 匹配时忽略大小写 | re.l或re.IGNORECASE |
Singleline | 单行模式,可以匹配所有字符,包括\n | re,S或re,DOTALL |
Multiline | 多行模式^行首、$行尾 | re.M或re,MULTILINE |
IgnorePatternWhitespace | 忽略表达式中的空白字符,如果要使用空白字符用转义,#可以用来做注释 | re,X或re.VERBOSE |
单行模式:
多行模式
默认模式:可以看作待匹配的文本是一行,不能看作多行,,点号不能匹配换行符,^和
表
示
行
首
和
行
尾
,
而
行
首
行
尾
就
是
整
个
字
符
串
的
开
头
和
结
尾
单
行
模
式
:
基
本
和
默
认
模
式
一
样
,
只
是
.
点
号
终
于
可
以
匹
配
任
意
一
个
字
符
包
括
换
行
符
,
这
是
所
有
文
本
就
是
一
个
长
长
的
只
有
一
行
的
字
符
串
,
就
是
这
一
行
字
符
串
的
行
首
,
表示行首和行尾,而行首行尾就是整个字符串的开头和结尾 单行模式:基本和默认模式一样,只是.点号终于可以匹配任意一个字符包括换行符,这是所有文本就是一个长长的只有一行的字符串,^就是这一行字符串的行首,
表示行首和行尾,而行首行尾就是整个字符串的开头和结尾单行模式:基本和默认模式一样,只是.点号终于可以匹配任意一个字符包括换行符,这是所有文本就是一个长长的只有一行的字符串,就是这一行字符串的行首,就是这一行的行尾
多行模式:重新定义了行的概念,但不影响,点号的行为,^和$还是行首行尾的意思,只不过因为多行模式可以识别换行符了,开始指的是\n后紧接着下一个字符,结束指的是\n前的字符,注意最后一行结尾可以没有\n
简单讲,单行模式之影响,行为,多行模式重新定义行印象^和 $
默认模式下.功能照旧
单行模式下增强.的功能,所有都可匹配
多行下照旧
多行模式和单行模式都选择情况下,增强,的功能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。