首页  |  Linux  |  C/C++  |  网络编程  |  Python   |  Algorithm  |  数据库  |  经验  |   人生 & 随想   |  站内搜索  |  关于

<<< previous

该文已被浏览2533

Python:使用正则表达式(三)

2016-03-20

上一篇文章 中总结了一些在Python中使用正则表达式的用法,这篇文章中接着上一篇文章,仍然是一些在Python中使用正则表达式的一些用法.

#15: 向 sub 函数中传递函数参数

通常情况下,sub() 函数的第二个参数是要替换为的字符串,但是也可以向第二个参数传递一个函数参数,这个可以在一个函数中对正则式匹配内容做一些处理之后在进行替换。例如,要把一个字符串中所有数字都替换为该数字的2倍。
如果只打算使用同一个正则表达式处理少量字符串,可以使用如下全局函数:
import re
# string 为目标字符串,func 为传递的函数参数
result = re.sub.(r"\d+", func, string)
要重复使用同一个正则表达式,就需要使用一个编译好的对象:
import re
reobj = re.compile(r"\d+")
result = reobj.sub(func, string)
上面的两个代码片段中都调用了函数 func,这个函数需要在把它传递给 sub() 函数之前进行声明:
def func(matchobj):
    return str(int(matchobj.group())*2)

#16: 替换一个正则式匹配内的所有匹配

假设有一个字符串为 "one 1 2 3 two 4 5 threefour 6 7",你想要将 <b>..</b> 之间的数字都替换为字符 !,即替换一个正则匹配中的所有匹配,可以按照下面的方式来进行(类似于第12个例子).
import re
string = '<b>one 1 2 3 two 4 5 three</b>four 6 7'
inner = re.compile(r'\d+')
def replacewithin(matchobj):
    return inner.sub(matchobj, matchobj.group())
result = re.sub("<b>.*?</b>", replacewithin, string)

#17: 拆分字符串到列表

假设现在有一个字符串为 "1,2,3,4,5", 在这个字符串中,以逗号为分隔符,分割各个元素到一个列表之中,所得列表为 [1,2,3,4,5].此时,就要用到 re 模块中的 split() 函数了。
如果只需要处理少量字符串,可以使用全局函数:
import re
string = '1,2,3,4,5'
result = re.split(r',', string)
要重复使用同一个正则表达式,就需要使用一个编译好的对象:
import re
reobj = re.compile(r',')
result = reobj.split(string)
使用正则表达式拆分字符串实质上就是要产生与示例9相反的结果。所得到的不是所有正则匹配的列表,而是位于匹配之间的文本列表,其中也包含了第一个匹配之前和最后一个匹配之后的文本。
另外,split() 函数还可接受一个可选的参数,用来指定字符串进行拆分的最大次数.

#18: 拆分字符串到列表,并保留分隔符

假设现在有一个字符串为 "12345", 在这个字符串中,以逗号为分隔符,分割各个元素到一个列表之中,同时保留分隔符,所得列表为 [1,,2,,3,,4,,5].此时,就要用到 re 模块中的 split() 函数了,与上例不同的是,这次还要使用捕获分组,使用捕获分组后,正则匹配也会添加到结果列表中。
如果只需要处理少量字符串,可以使用全局函数:
import re
string = '1*2*3*4*5'
result = re.split(r'(\*)', string)
要重复使用同一个正则表达式,就需要使用一个编译好的对象:
import re
string = '1*2*3*4*5'
reobj = re.compile(r'(\*)')
result = reobj.split(string)
另外,split() 函数还可接受一个可选的参数,用来指定字符串进行拆分的最大次数.

#19: 逐行查找

有一个多行的字符串,现在想要每次将正则表达式用在这个多行字符串的一行之上,即进行类似于 grep 的逐行查找,可以首先把它拆分成一个字符串列表,该列表中每个字符串都包含一行文本。
import re
# 拆分多行字符串 MultilineString
lines = re.split(r"\r?\n", MultilineString)
之后遍历这个列表 lines, 并将正则表达式应用到每一行之上:
reobj = re.compile("regex pattern")
for line in lines:
    if reobj.search(line):
        # Match
    else:   
        # Do not match

#20: 获取捕获分组的位置

要获取捕获分组在字符串中的位置,可以使用 re 模块中的 span() 函数,示例如下:
import re
m = re.search('[0-9]*([a-zA-Z]*)[0-9]*', string)
print(m.group(1))   # 输出 Hello
print(m.span(1))    # 输出 (3,8),即捕获分组的位置信息                


一如既往,如果你对文章中的内容有任何疑问,或者是发现文章中有任何错误,都可以通过下面的地址发邮件告诉我.
E-mail: rytubuntulinux@gmail.com