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

<<< previous

该文已被浏览1791

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

2016-03-20

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

#8: 获取匹配文本的一部分

在第6个例子中,我们使用了无参的 group() 函数来提取匹配的文本,但是如果我们想要的只是匹配文本中的一部分该怎么办呢?此时就要用到捕获分组了,使用捕获分组将想要的部分分离出来.例如 https://([0-9a-z.]+) 会匹配字符串 "Click https://www.google.com" 中的 "https://www.google.com"。而捕获分组中匹配的是 "www.google.com", 你想要提取这部分内容。这时仍然要用到 group() 函数,不同的是,这次要使用的是包含有参数的 group().
对于一次性的快速测试,可以直接像下面这样做:
import re
string = 'Click https://www.google.com'
matchobj = re.search("https://(0-9a-z.)+", string)
if matchobj:
    result = matchobj.group(1)
else:
    result = ''
如果要重复使用同一个正则表达式,最好使用编译好的对象:
import re
string = 'Click https://www.google.com'
reobj = re.compile("https://(a-z0-9.)+")
matchobj = reobj.search(string)
if matchobj:
    result = matchobj.group(1)
else:
    result = ''
上面的程序中将参数 1 传递给 group() 函数,表示获取第一个分组的内容,如果传递 2, 则表示获取第二个分组的内容,以此类推。Python最多支持99个捕获分组.

#9: 获取所有的匹配子串

通过 search() 函数只能匹配第一个匹配的子串,而要想获取所有匹配的子串,可以使用 findall()函数,该函数匹配目标字符串中与正则式匹配的所有子串,并返回一个包含所有匹配子串的列表.
对于一次性的快速测试,可以直接像下面这样做:
import re
# string 为目标字符串
result = re.findall("regex pattern", string)
如果要重复使用同一个正则表达式,最好使用一个编译好的对象,之后调用该对象的 findall() 函数:
import re
reobj = re.compile("regex pattern")
# string 为目标子串
result = reobj.findall(string)

#10: 遍历所有匹配

要遍历所有的匹配,可以使用 finditer() 函数,该函数会返回一个迭代器,通过该迭代器可以找到正则表达式的所有匹配。
如果只打算使用同一个正则表达式处理少量字符串,可以使用全局函数:
import re
# string 为目标字符串
for matchobj in re.finditer("regex pattern", string):
    # do something
如果要重复使用同一个正则表达式,就需要使用一个编译好的对象:
import re
reobj = re.compile("regex pattern")
# string 为目标字符串
for matchobj in reobj.finditer(string):
    # do something

#11: 获取符合某些条件的匹配结果

假如现在有一个字符串 "1,2,3,4,5",现在要获取其中的偶数数字,就需要在获取这些数字之前进行一些验证.示例如下:
如果只打算使用同一个正则表达式处理少量字符串,可以使用全局函数:
import re
ls = []
string = '1,2,3,4,5'
for matchobj in re.finditer(r'\d+', string):
    if int(matchobj.group()) % 2 == 0:
        ls.append(matchobj.group())
如果要重复使用同一个正则表达式,就需要使用一个编译好的对象:
import re
ls = []
string = '1,2,3,4,5'
reobj = re.compile(r"\d+")
for matchobj in reobj.finditer(r'\d+', string):
    if int(matchobj.group()) % 2 == 0:
        ls.append(matchobj.group())

#12: 在一个匹配子串中查找另一个匹配

假设有一个HTML文件,其中有些段落使用<b>标签标记为了粗体。现在想要找到所有标记为粗体的数字,此时就要用到 在一个匹配子串中查找另一个匹配 了,即在所有标记为粗体的子串中查找数字。
import re
ls = []
string = "<b>2</b>3 4 <b>5 6 7</b>"
inner = re.compile(r"\d+")
for outer in re.finditer("<b>(.*?)</b>", string):
    ls.extend(inner.findall(outer.group(1)))

#13: 替换所有匹配

要将所有匹配的子串替换为另外一些字符,可以使用 sub() 函数,该函数接受三个参数,全局的 sub() 函数可以接受三个参数,第一个参数是正则表达式,用于匹配子串,第二个参数是要将匹配的子串替换为哪些字符,第三个参数是目标字符串.
如果只是处理少量字符串,可以使用全局函数:
import re
# string 为目标字符串,new_string 为要替换为的字符串
result = re.sub('regex pattern', 'new_string', string)
如果要在程序中反复使用同一个正则表达式,就需要使用编译好的对象:
import re
reobj = re.compile('regex pattern')
result = reobj.sub('new_string', string)
此外,sub() 函数还可以接受一个可选参数,允许你使用它来限制替换执行的次数.

#14: 使用匹配的子串来替换匹配

假如你想要匹配由等号分隔的单词对,然后把等号两边的单词进行交换,可以使用 反向引用 来完成.
如果只打算使用同一个正则表达式处理少量字符串,可以使用如下全局函数:
import re
string = 'Hello=World'
result = re.sub(r"(\w+)=(\w+)", r"\2=\1", string)
要重复使用同一个正则表达式,就需要使用一个编译好的对象:
import re
string = 'Hello=World'
reobj = re.compile(r"(\w+)={\w+}")
result = reobj.sub(r"\2=\1", string)


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