玩弄 python 正则表达式

这里记录一个我常用的模型,每次久了不使用正则就会忘记。

记得最好玩的一句关于正则表达式的话就是 当你想到一件事情可以用正则表达式解决的时候 现在你就面临了两个问题了。

  

python里面使用了re模块对正则表达式进行了集成。

下面来匹配这样一段话作为例子

"JD请求异常返回: 商品列表中含有不能购买的商品[1322410]" 注意这个括号里面的数字是随机的

 

匹配方法1.

使用re.match方法这个方法如果匹配成功将返回一个匹配成功的对象可以使用对象的相关方法提取内容,如果没有匹配到将会返回None.

如我使用下面代码:

import re
haha = re.match("JD请求异常返回: 商品列表中含有不能购买的商品\[(\d+)\]", "JD请求异常返回: 商品列表中含有不能购买的商品[1322410]", )
print haha.group(0)

打印:
JD请求异常返回: 商品列表中含有不能购买的商品[1322410]

 

匹配方法2.

使用re.compile先创建一个partten,之后方便直接使用相关方法例如:

import re
group_by_regex = re.compile("JD请求异常返回: 商品列表中含有不能购买的商品\[(\d+)\]")
text = "JD请求异常返回: 商品列表中含有不能购买的商品[1322410]"
m = group_by_regex.search(text)
result = m.group(1)

这里必须多阐述一下,其实在上面匹配方法一中的第一个入参就是一个pattern,一个匹配模式。这里匹配方法二中我们首先创建了一个正则表达式的匹配模式group_by_regex。然后使用这个匹配模式的方法的search查找到第一个符合的对象就返回。

这里还有个需要注意的地方上面的match 和 这里的search有什么区别呢。 

match是必须从开始就匹配上才算,而search不管这么多,他会扫描整个处理串里面有没有这个匹配对象而不必担心他是不是从头开始的。

那么如果想匹配对象中所有符合条件的呢?可以使用findall方法。

 

下面我们来看一些python里面特有的正则表现,比如说命名正则。

r'^actions/rate/(?P<model>\w+)/(?P<pk>[\w|\d]+)/-/(?P<location>\w+)/$

这里先重点来看这一句

/?P<model>\w+/

?P开头是一个python里独有的扩展语法,是python的命名组语法。有点像()捕捉器,但是是可以从model这个名字里面读取的。这句话就是<model> 是 w(类似但不等价于“[A-Za-z0-9_])类型的字符,捕捉1个或者多个。

知道了这个我来一并解释整句正则想要匹配什么。

/(?P<pk>[\w|\d]+)/-/(?P<location>\w+)/$

后面继续使用python命名组语法匹配pk,[\w|\d]+ 是匹配 [A-Za-z0-9_]其中的数字一个或者多个。其实这里写得应该有点问题,\w是包含\d的应该不用选择直接使用\w+就可以了。后面的/-/直接匹配“-”,然后后面又是一个命名组匹配location。这种语法在django的url模版的里面应该经常能见到。

 

更多处理方法可以参考python文档,最常用的就上面两种方法。

更加复杂和全面的用法可以参考引用2.

 

Reference:

http://www.cnblogs.com/sevenyuan/archive/2010/12/06/1898075.html

http://www.jb51.net/article/50511.htm  python正则表达式re模块详细介绍

 

posted @ 2016-07-06 16:14  piperck  阅读(507)  评论(0编辑  收藏  举报