龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > python编程 >

python中正则表达式的使用详解(2)

时间:2014-10-18 12:11来源:网络整理 作者:网络 点击:
分享到:
复制代码 代码如下: result=prog.match(string) ##这个等同于 result=re.match(r"(=li).*(=/li)",string) ##但是如果这个正则需要在程序匹配多次,那么通过正则表达式对象的

复制代码 代码如下:

result=prog.match(string) 
##这个等同于 
result=re.match(r"(?<=<li>).*?(?=</li>)",string) 
##但是如果这个正则需要在程序匹配多次,那么通过正则表达式对象的方式效率会更高 

接下来就是查找了,假设我们的html结果已经以html的格式存放在text中,那么通过

复制代码 代码如下:

result_list = re.findall(r"(?<=<li>).*?(?=</li>)",text) 

便可以取得所需的结果列表.

二.替换
使用正则表达式进行替换非常的灵活.

比如之前我在阅读Trac这个系统中wiki模块的源代码的时候,就发现其wiki语法的实现就是通过正则替换进行的.

在使用替换的时候会涉及到正则表达式中的Group分组的概念.

假设wiki语法中使用!表示转义字符即感叹号后面的功能性字符会原样输出,粗体的语法为

写道
'''这里显示为粗体'''
 那么有正则表达式为

复制代码 代码如下:

r"(?P<bold>!?''')" 

  这里的?P<bold>是Python正则语法中的一部分,表示其后的group的名字为"bold"

  下面是替换时的情景,其中sub函数的第一个参数是pattern,第二个参数可以是字符串也可以是函数,如果是字符串的话,那么就是将目标匹配的结果替换成指定的结果,而如果是函数,那么函数会接受一个match object的参数,并返回替换后的字符串,第三个参数便是源字符串.

复制代码 代码如下:

result = re.sub(r"(?P<bold>!?''')", replace, line) 

每当匹配到一个三单引号,replace函数便运行一次,可能这时候需要一个全局变量记录当前的三单引号是开还是闭,以便添加相应的标记.

在实际的trac wiki的实现的时候,便是这样通过一些标记变量,来记录某些语法标记的开闭,以决定replace函数的运行结果.

--------------------

示例

一. 判断字符串是否是全部小写

代码

复制代码 代码如下:

# -*- coding: cp936 -*-
import re 
s1 = 'adkkdk'
s2 = 'abc123efg'

an = re.search('^[a-z]+$', s1)
if an:
    print 's1:', an.group(), '全为小写'
else:
    print s1, "不全是小写!"

an = re.match('[a-z]+$', s2)
if an:
    print 's2:', an.group(), '全为小写'
else:
    print s2, "不全是小写!"

结果

 

究其因

1. 正则表达式不是python的一部分,利用时需要引用re模块

2. 匹配的形式为: re.search(正则表达式, 带匹配字串)或re.match(正则表达式, 带匹配字串)。两者区别在于后者默认以开始符(^)开始。因此,

re.search('^[a-z]+$', s1) 等价于 re.match('[a-z]+$', s2)
3. 如果匹配失败,则an = re.search('^[a-z]+$', s1)返回None

group用于把匹配结果分组

例如

复制代码 代码如下:

import re
a = "123abc456"
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)   #123abc456,返回整体
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)   #123
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)   #abc
print re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)   #456

1)正则表达式中的三组括号把匹配结果分成三组

  group() 同group(0)就是匹配正则表达式整体结果

  group(1) 列出第一个括号匹配部分,group(2) 列出第二个括号匹配部分,group(3) 列出第三个括号匹配部分。

2)没有匹配成功的,re.search()返回None

3)当然郑则表达式中没有括号,group(1)肯定不对了。

二.  首字母缩写词扩充

具体示例

FEMA   Federal Emergency Management Agency
IRA    Irish Republican Army
DUP    Democratic Unionist Party

FDA    Food and Drug Administration
OLC    Office of Legal Counsel
分析

缩写词  FEMA
分解为  F*** E*** M*** A***
规律    大写字母 + 小写(大于等于1个)+ 空格
参考代码

精彩图集

赞助商链接