视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python捕获篇之正则表达式
2020-11-27 14:24:26 责编:小采
文档


什么是捕获呢?使用小括号指定一个子表达式后,匹配这个子表达式的文本(即匹配的内容)可以在表达式或者其他过程中接着用,下面这篇文章就主要介绍了Python正则表达式中关于捕获的相关资料,需要的朋友可以参考下。

前言

在上一篇文中,我们介绍了关于Python正则表达式的基础,那么在这一篇文章里,我们将总结一下正则表达式关于捕获的用法。下面话不多说,来看看详细的介绍吧。

捕获

捕获和分组在正则表达式中有着密切的联系,一般情况下,分组即捕获,都用小括号完成(因此,小括号在正则表达式中也属于特殊字符,表达原含义时需要转义):

(…) 正常分组,并捕获

(?:…) 分组,但是不捕获

举个例子,假设我们需要匹配一个座机号码:

>>> m = re.search(r'^(d{3,4}-)?(d{7,8})$','020-82228888')
>>> m.group(0)
'020-82228888'
>>> m.group(1)
'020-'
>>> m.group(2)
'82228888'

这里,默认分组(0)是完整的匹配,之后的分组则按出现顺序排列。

接下来,我们想在一整段文本中,找出所有的座机号码,这里需要用到re.findall:

>>> re.findall(r'(d{3,4}-)?(d{7,8})','020-82228888
0357-4227865') 
[('020-', '82228888'), ('0357-', '4227865')]

findall有一个特性,就是如果结果中有捕获的分组,则将捕获的分组组成tuple返回。利用这个特点,和上面提到的分组,但是不捕获的语法,可以得到我们想要的结果:

>>> re.findall(r'(?:d{3,4}-)?d{7,8}','020-82228888
0357-4227865') 
['020-82228888', '0357-4227865']
>>> re.findall(r'(?:d{3,4}-)?d{7,8}','020-82228888
4227865') 
['020-82228888', '4227865']

在正则表达式中,也可以通过1,2等来指代之前捕获的字符串组合。这个经常用于单双引号的正确匹配:

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'["'](.*?)["']', sentence)
['why?', 'I don']
>>> re.findall(r'(["'])(.*?)1', sentence)
[('"', 'why?'), ('"', "I don't know")]

此外,如果觉得1,2这种表示可读性不好的话,还可以给捕获起一个英文名字。如下例子中,实现了两种不同的日期格式之间的转换:

>>> sentence = "from 12/22/1629 to 11/14/13"
>>> re.sub(r'(?P<month>d{2})/(?P<day>d{2})/(?P<year>d{4})', r'g<year>-g<month>-g<day>', sentence) 
'from 1629-12-22 to 13-11-14'

但是,这种命名引用捕获的方式,在findall、search中却是无效的:

>>> sentence = """You said "why?" and I say "I don't know"."""
>>> re.findall(r'(?P<quote>["'])(.*?)g<quote>', sentence) 
[]
>>> re.search(r'(?P<quote>["'])(.*?)g<quote>', sentence) 
>>> re.search(r'(?P<quote>["'])(.*?)1', sentence) 
<_sre.SRE_Match object; span=(9, 15), match='"why?"'>
>>> re.search(r'(?P<quote>["'])(.*?)1', sentence).groupdict()
{'quote': '"'}

【相关推荐】

1. Python免费视频教程

2. Python基础入门手册

3. Python面向对象视频教程

下载本文
显示全文
专题