首页 > 代码库 > Python基础 :正则表达式

Python基础 :正则表达式

一、前言

1.1正则表达式简述

正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如正则表达式被用于:

  1.检查文本中是否含有指定的特征词

  2.找出文中匹配特征词的位置

  3.从文本中提取信息,比如:字符串的子串

  4.修改文本

与文本编辑器相似,几乎所有的高级编程语言都支持正则表达式。在这样的语境下,“文本”也就是一个字符串,可以执行的操作都是类似的。一些编程语言(比如Perl,JavaScript)会检查正则表达式的语法。

 

1.2 常用的正则匹配工具 

在线匹配工具:

  1. http://www.regexpal.com/ 

      2. http://rubular.com/ 

正则匹配软件:

      McTracer 

      用过几个之后还是觉得这个是最好用的,支持将正则导成对应的语言如java C# js等还帮你转义了,Copy直接用就行了很方便,另外支持把正则表达式用法解释,如哪一段是捕获分组,哪段是贪婪匹配等等,总之用起来 So Happy .

 

1.3正则表达式语法

  \w匹配字母数字及下划线

  \W匹配非字母数字及下划线

  \s匹配任意空白字符,等价于 [\t\n\r\f].

  \S匹配任意非空字符

  \d匹配任意数字,等价于 [0-9]

  \D匹配任意非数字

  \A匹配字符串开始

  \Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串

  \z匹配字符串结束

  \G匹配最后匹配完成的位置

  \n匹配一个换行符

  \t匹配一个制表符

  ^匹配字符串的开头

  $匹配字符串的末尾。

  .匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。

  [...]用来表示一组字符,单独列出:[amk] 匹配 ‘a‘,‘m‘或‘k‘

  [^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。

  *匹配0个或多个的表达式。

  +匹配1个或多个的表达式。

  ?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式

  {n}精确匹配n个前面表达式。

  {n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式

  a|b匹配a或b

  ( )匹配括号内的表达式,也表示一个组

可能完了之后就有点晕晕的了把,不用担心,下面我们会详细讲解下一些常见的规则的用法。怎么用它来从网页中提取我们想要的信息。

 

1.4Python中使用

其实正则表达式不是Python独有的,它在其他编程语言中也可以使用,但是Python的re库提供了整个正则表达式的实现,利用re库我们就可以在Python中使用正则表达式来,在Python中写正则表达式几乎都是用的这个库。

下面我们就来了解下它的用法。

match()

在这里首先介绍第一个常用的匹配方法,match()方法,我们向这个方法传入要匹配的字符串以及正则表达式,就可以来检测这个正则表达式是否匹配字符串了。

match()方法会尝试从字符串的起始位置匹配正则表达式,如果匹配,就返回匹配成功的结果,如果不匹配,那就返回None。

我们用一个实例来感受一下:

import re

content =Hello 123 4567 World_This a Regex Demo
print (len(content))
result = re.match(^Hello\s\d\d\d\s\d{4}\s\w{10},content)
print result
print result.group()
print result.span()

输出结果:

技术分享

在这里我们首先声明了一个字符串,包含英文字母、空白字符、数字等等内容,接下来我们写了一个正则表达式^Hello\s\d\d\d\s\d{4}\s\w{10}来匹配这个长字符串。

开头的^是匹配字符串的开头,也就是以Hello开头,然后\s匹配空白字符,用来匹配目标字符串的空格,\d匹配数字,三个\d匹配123,然后再写一个\s匹配空格,后面还有4567,我们其实可以依然用四个\d来匹配,但是这么写起来比较繁琐,所以在后面可以跟{4}代表匹配前面的字符四次,也就是匹配四个数字,这样也可以完成匹配,然后后面再紧接一个空白字符,然后\w{10}匹配10个字母及下划线,正则表达式到此为止就结束了,我们注意到其实并没有把目标字符串匹配完,不过这样依然可以进行匹配,只不过匹配结果短一点而已。

我们调用match()方法,第一个参数传入了正则表达式,第二个参数传入了要匹配的字符串。

打印输出一下结果,可以看到结果是SRE_Match对象,证明成功匹配,它有两个方法,group()方法可以输出匹配到的内容,结果是Hello 123 4567 World_This,这恰好是我们正则表达式规则所匹配的内容,span()方法可以输出匹配的范围,结果是(0, 25),这个就是匹配到的结果字符串在原字符串中的位置范围。

通过上面的例子我们可以基本了解怎样在Python中怎样使用正则表达式来匹配一段文字。

二、正则表达式练习

          初级练习

                   1、求非负整数 : ^\d+$

                       Tips:需要注意的是这个匹配模式为多行模式下进行的

             技术分享

                  2、匹配正整数: ^[1-9]*[1-9][0-9]*$ 在网上也有这种写法的 ^[0-9]*[1-9][0-9]*$

                      这里截图我也不贴了,前者指能匹配123012这种整数,而后者可以匹配001230。

                       取舍就看实际的需要了

                  3、非正整数:^(-\d+|(0+))$

                  4、负整数:^-[0-9]*[1-9][0-9]*$  

                  5、整数 :^-?\d+$

                  6、非负浮点数 :^\d+(\.\d+)?$

                  7、正浮点数 :^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

                  8、非正浮点数 :^((-\d+(\.\d+)?)|(0+(\.0+)?))$

                  9、负浮点数:^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

                 10、浮点数:^(-?\d+)(\.\d+)?$

                 11、有数字、26个英文字母组成的字符串:^[A-Za-z0-9]+$

          中级练习

 

                   1、长度为8-10的用户密码(以字母开头、数字、下划线)

                        ^[a-zA-Z]\w{7,10}$

                   2、验证输入只能是汉字 : ^[\u4e00-\u9fa5]{0,}$

                   3、电子邮箱验证:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

                   4、URL地址验证:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

                   5、电话号码的验证:请参考:http://blog.csdn.net/kiritor/article/details/8733469

                   6、简单的身份证号验证:\d{15}|\d{18}$

                   ..............................          

          高级练习

                  1、提取并捕获html标签内容:

                     <a(?: [^>]*)+href=http://www.mamicode.com/([^ >]*)(?: [^>]*)*>

               技术分享

                    <OPTION\s.*?>

               技术分享

以上练习是参考网上的。写的不好之处,请大家多多指教。

Python基础 :正则表达式