Python模块:re(正则表达式)

正则表达式是字符串匹配的一种语法。这个表达式会被翻译为一系列指令,这些指令把字符串当做输入,产生匹配的子串或对原字符串进行修改。很多编程语言都内置了regex,如,Perl、Ruby、Awk、和Tcl。其他语言像C/C++、Python通过第三方库支持regex。

查找匹配的字符串

判断一个字符串包含指定字串:

QQ截图20151215134947

search函数查找字符串,如果找到返回match对象,如果没有找到,返回None。
返回的match中,包含原字符串、regex表达式、和匹配处的索引:

QQ截图20151215134947

编译正则表达式

如果一个表达式多次使用,可以把它编译为RegexObject对象,提高执行效率。把上面代码改为编译版本,如下:

QQ截图20151215134947

search和findall对比

finditer函数返回可迭代的Match对象,而不是findall函数只返回的字符串:

regex重复语法

上面只是简单的字符串查找,regex有更强大更复杂的表达方式。
下面我们来看一下用regex怎么表达重复:

  • *:重复无限多次或重复0次,如”ab*”可以匹配a、ab、abb…..
  • +:至少重复一次,如”ab+”可以匹配abb、abbb……
  • ?:重复一次或重复0次,如”ab?”可以匹配a、ab、abb。
  • {m}:m为重复次数,如”ab{3}”可以匹配abbb
  • {m,n}:重复m到n次,如”ab{2,3}”可以匹配abb、abbb

注意为0的:代表重复0次,也就是什么也没有。

看下面一个例子:

regex字符集语法

使用[],例如[ab],会匹配a或者b:

贪婪和非贪婪:

a[ab]+取整个字符串是因为第一个字母是a,所有的子串不是a就是b。

排除符号^,下面regex匹配不包含- . 或空格:

字符集范围:

点(.):匹配一个任意字符:

转义代码

  • d:数字
  • D:非数字
  • s:空白字符(tab,space,newline…)
  • S:非空白字符
  • w:字母数字
  • W:非字母数字

对regex语法中用到的字符进行转义:

锚点

  • ^:字符串开始或行开始
  • $:字符串尾或行尾
  • A:字符串开始
  • Z:字符串结束
  • b:空字符在开始或尾
  • B:空字符不在开始或尾

使用match函数

match限制了匹配必须从字符串头开始,例如:

search函数也接受start和end位置参数,用来限制匹配范围:

每次找到一个匹配,匹配的结束就是下一次搜索的开始。上面的实现没有iterall函数效率高,

圆括号-(分组)

我们已经提到了怎么重复单个字符;但如果想要重复一个字符串又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作:

使用match里的groups方法,可以单独的列出圆括号内的匹配:

上面是匹配一个分组的情况,如果用多个分组,可以用group方法取出指定匹配,match.group(0)

为分组起名,语法(?P<name>pattern)

非捕捉分组(语法(?:pattern))和捕捉分组:

搜索选项

大小写不敏感匹配

多行输入

DOTALL:也是多行相关的

未完待续

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注