Python Capturer des expressions régulières

Y2J
Libérer: 2017-05-06 14:41:08
original
1365 Les gens l'ont consulté

什么是捕获呢?使用小括号指定一个子表达式后,匹配这个子表达式的文本(即匹配的内容)可以在表达式或者其他过程中接着用,下面这篇文章就主要介绍了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'
Copier après la connexion

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

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

>>> re.findall(r'(\d{3,4}-)?(\d{7,8})','020-82228888\n0357-4227865') 
[('020-', '82228888'), ('0357-', '4227865')]
Copier après la connexion

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

>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n0357-4227865') 
['020-82228888', '0357-4227865']
>>> re.findall(r'(?:\d{3,4}-)?\d{7,8}','020-82228888\n4227865')  
['020-82228888', '4227865']
Copier après la connexion

在正则表达式中,也可以通过\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")]
Copier après la connexion

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

>>> sentence = "from 12/22/1629 to 11/14/1643"
>>> re.sub(r&#39;(?P<month>\d{2})/(?P<day>\d{2})/(?P<year>\d{4})&#39;, r&#39;\g<year>-\g<month>-\g<day>&#39;, sentence) 
&#39;from 1629-12-22 to 1643-11-14&#39;
Copier après la connexion

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

>>> sentence = """You said "why?" and I say "I don&#39;t know"."""
>>> re.findall(r&#39;(?P<quote>["\&#39;])(.*?)\g<quote>&#39;, sentence)  
[]
>>> re.search(r&#39;(?P<quote>["\&#39;])(.*?)\g<quote>&#39;, sentence)   
>>> re.search(r&#39;(?P<quote>["\&#39;])(.*?)\1&#39;, sentence)  
<_sre.SRE_Match object; span=(9, 15), match=&#39;"why?"&#39;>
>>> re.search(r&#39;(?P<quote>["\&#39;])(.*?)\1&#39;, sentence).groupdict()
{&#39;quote&#39;: &#39;"&#39;}
Copier après la connexion

【相关推荐】

1. Python免费视频教程

2. Python基础入门手册

3. Python面向对象视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!