正则表达式学习笔记(一)

来源:互联网 发布:c语言预处理指令应用 编辑:程序博客网 时间:2024/05/22 03:35

一、什么是正则表达式

       在进行文本处理的时候,我们经常需要根据自己的需求提取某些特定的字符串,因而我们需要给计算机提供匹配模板,而这个模板就是正则表达式。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

       大部分时候我们见到的正则表达式都是以字符串的形式展现,如"w+\\.baidu\\.com",以至于我曾认为正则表达式就是一个字符串。但其实这只是为了方便人们使用,以Python语言的re模块为例: re.match("p","python") ,字符串"p"会在内部先转换为正则表达式对象(Pattern),然后再与字符串"python"进行匹配,需要注意的是正则表达式匹配的是整个字符串,而不是进行包含匹配,所以尽管"python"匹配到了第一个字符p,但由于后面还有字符,故匹配失败返回False。为了简化使用,大部分的需要用到正则表达式的函数(split、replace),都不需要程序员自己先去定义一个Pattern对象(Pattern对象自己也有许多方法,高效匹配),而只需将正则表达式字符串作为参数传递给函数就可以了,字符串转正则表达式对象的过程在函数内部完成。所以,正则表达式不是字符串

 二、常见正则表达式符号

        .             通配符,匹配任何一个字符

           *            允许模式重复0次或多次

         +            允许模式重复一次或多次(至少重复一次

         {m,n}      允许模式重复m~n次

          |              选择符,选择匹配其中的一个,如'p(ython|erl)'

                     重复前面的内容0次或一次

          []            字符集,可以匹配字符集里面的任意一个字符,如[^a-z]  

          $            匹配字符串的结束位置

         ^             匹配字符串的开始位置

         \d            匹配一个数字字符(0~9),\D表示非数字(通常大小写意义相反)

         \b            匹配一个单词边界,如"s\b"可以匹配"thanks"中的"s"而不能匹配"ask"中的"s"

         \s            匹配任何一个非空白字符

       \w            匹配包括任何一个包括下划线的单词字符,等价于[a-zA-Z0-9_]


三、关于转义符

     在ASCII字符集中,有一些字符并不能直接显示,如换行符、回车符、制表符等,因而在字符串中,我们需要借助反斜杠"\"加字母的形式来显示告诉人们此处是一个什么字符,即字符串转义符。然而,正则表达式某些字符也有其特殊含义,如”.“就是匹配任意一个字符,如果我们想匹配的就是符号"."呢?我们就需要借助正则表达式转义符了,以书写匹配网址的正则表达式为例:


首先我们需要根据要匹配的内容写出正则表达式,由于里面包含有正则表达式的特殊字符通配符.,它意味着此处可以匹配任意一个字符,而实际我们只是想匹配一个符号.,所以我们需要借助正则表达式转义符对其进行转义\. ,这样我们就的得到了我们想要的正则表达式。接着我们再将正则表达式转换为字符串,由于www\.(.+)\.com包含有对于字符串来说具有特殊意义的字符"\",我们怎么能区分这是符号”\“还是转义符”\”,所以我们需要在"\"前面再加上一个字符串转义符“\\”。总之,字符串和正则表达式都有转义符,在书写正则表达式字符串一定要区分清楚。

四、贪婪与非贪婪

对于上面的正则表达式,如果我们想用来字符串做替换,比如我们想替换"www.first.comwww.second.com"中的www.second.com和www.second.com


可以看到,整个字符串被直接替代了,只输出了一个‘$’,而不是分别替换。原因在于正则表达式中的重复运算符+默认是贪婪的,它会进行尽可能多的匹配。如果想分别替换,只需要在重复运算符后面加上?,这样它就会进行尽可能少的匹配,即非贪婪模式。


0 0
原创粉丝点击