现在的位置: 首页 > 网站运营推广 > 正文

正则表达式语法进阶教程【笨鸟笔记②】

2013年05月28日 网站运营推广 ⁄ 共 2419字 评论数 2 ⁄ 阅读 2,708 次

正则表达式入门

1、正则表达式中常见元字符

【字符类元字符】

.        匹配除换行符外任意一个字符

\w      只匹配英文字母、数字和下划线(通过设置甚至可包含汉字)

\d       匹配一个0~9的数字

\s       匹配任何单个的空白字符,如空格符、制表符(Tab)、换行符

\t       匹配一个制表符(Tab)

\n       匹配一个换行符

\r       匹配回车符

注:通过某些设置,\w可被用于Unicode字符集而非仅仅ASCII字符集。

字符集科普:

ASCII美国单字节编码字符集,主要用于英语和西欧语言。

GB2312中国简体汉字及其他字符集。

BIG5台湾繁体字符集。

Unicode八位编码全球语言字符集,常见有UTF-8、UTF-16等。

【位置类元字符】

^       匹配行的开始位置

$       匹配行的结束位置

\<和\>  分别匹配一个单词的开始和结束位置

\b      匹配一个单词的边界(出现在一个单词的开始或结束位置)

【其他元字符】

[]      主要用于表示字符集

()      可用于分组、捕获、分枝条件选择、用于方括号外匹配正则表达式群等

?      可用于限定符表示0或1,同时用于引用、捕获、贪婪或懒惰模式选择等

*      主要用于限定符,表示0个或任意个

+      主要用于限定符,表示1个或任意个

\      在元字符、转义等处用到

|       在圆括号分枝条件选择中表示逻辑“或”

所有文字类元字符,想在正则表达式中使用这些字符用作文本字符,需要用反斜杠/进行转义。

注:\w、\d、\s、\b等将字母大写可表示其反义,具体将在第4项【反义】中讲解。

2、正则表达式中所有种类括号及其用法

在正则表达式中会见到的括号包括大括号{}、中括号[]、小括号()、尖括号<>四种,下面笨鸟带大家分别了解一下其用法。

【大括号{}】

大括号相当于限定符,它是针对某“块”正则表达式对其匹配次数进行限定,如{n}表示匹配n次,{n,m}表示匹配n到m次,{n,}表示至少匹配n次。

【中括号[]】

中括号表示字符集,其用法主要有三种,穷举型、范围型和取反型。穷举型如[abcde]匹配abcde中任意一个字符;范围型如[a-e1-5]匹配abcde或12345中任意一个字符;取反型如[^abcde]匹配任意非abcde中任意一个字符。

注:方括号中元字符将失去特殊含义,若表示]需放在第一个位置,表示-应放在第一或最后一个位置。

【圆括号()】

圆括号是正则表达式中的元字符,可以表示的含义较多,具体用法我们在下一项中单独来讲。圆括号可用于方括号外,匹配正则表达式群。

【尖括号<>】

尖括号并非元字符,而是直接量,没有特定含义,一般在代码中出现,表示代码标签的开始或结束。

3、正则表达式中圆括号的用法

【使用圆括号分组】

正则表达式中圆括号的作用是对字符进行分组,并保存匹配的文本。当在模式中使用圆括号时,要特别注意圆括号里不能包含任何空白符,因为如果包含了空白符,正则表达式引擎就会将这个空白符作为字符序列的一部分来处理。而如果它没有找到匹配的空白符,就会导致匹配失败。

【圆括号和限定符】

圆括号的一个基本用法是对字符或元字符进行分组,这样在括号内可以对字符组合使用限定符。如(A\d){2},A后跟一个数字再跟一个A再跟一个数字。

【交替选择】

在正则表达式中用于表示二选一或多选一。在两个字符二选一时,使用字符类来代替交替选择通常会提高匹配效率。然而,大多情况下当为词时不可以用字符类来代替交替选择。

交替选择与词边界,如(doctor|Dr)\>

错误匹配的交替行为

这个问题在选项是不同长度的字符序列,而较短的字符序列位于左侧,同时较短的选项又被较长的选项所包含时。例如(a|ab),这种仅匹配a,正确的写法应为(ab|a)。

【捕获圆括号】

命名的组,在Python和.NET语言中可以创建命名的组。.NET中相应语法为:(?<组名>模式)或(?’组名’模式),而在Python中相应的语法为(?P<组名>模式)。第一个捕获的就是变量$1的值,第二个捕获的就是变量$2的值,依次计算。

【非捕获的圆括号】

别称有仅分组的圆括号,形式为(?:模式)

【位置查找】

肯定式向前查找 (?=exp) 即查找exp之前的位置,即某个位置之后是exp

exp为举例字符序列

例如:(?=States)State 与 State(?=s) 等价

Star(?= Training)为查找空格后有Traning前为Star的字符

否定式向前查找 (?!exp) 即查找不是exp之前的位置,即,某个位置之后不是exp

肯定式向后查找 (?<exp) 即查找exp后面的位置,即某个位置之前是exp

其工作原因是先查找匹配项,再进行位置判断

否定式向后查找 (?<!exp) 即查找不是exp后面的位置,即某个位置之前不是exp

【案例】

查找给数字添加逗号分隔符的位置

(?<=\d)(?=\d\d\d)  错误,如123456时会匹配1,2,3,456

(?<=\d)(?=(\d\d\d)+)  错误,如123456时会匹配1,2,3,456

(?<=\d)(?=(\d\d\d)+$) 错误,如123456.时即数字最后有其他符号,56.会被分组,匹配1,23456.

(?<=\d)(?=(\d\d\d)+\W) 正确

4、正则表达式中反义的用法

在正则中,有时我们会需要用到特定字符的反义或排除,如不匹配数字等。此时,我们就要用到反义了,常见反义如下:

\W     匹配任意不是英文字母、数字和下划线字符(通过设置甚至可包含汉字)

\D         匹配任意非数字字符

\S         匹配任意非空白符的字符

\B         匹配不是单词开头或结尾的位置

[^example]  匹配任意除字符集外的字符

 

【正则表达式系列导航】

1、正则表达式入门基础教程【笨鸟笔记①】

2、正则表达式语法进阶教程【笨鸟笔记②】

3、正则表达式思维教程【笨鸟笔记③】

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

目前有 2 条留言 其中:访客:0 条, 博主:0 条 引用: 2

    给我留言

    留言无头像?