Heim >Backend-Entwicklung >Python-Tutorial >Python Capture reguläre Ausdrücke

Python Capture reguläre Ausdrücke

Y2J
Y2JOriginal
2017-05-06 14:41:081425Durchsuche

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

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']

在正则表达式中,也可以通过\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/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;

但是,这种命名引用捕获的方式,在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;}

【相关推荐】

1. Python免费视频教程

2. Python基础入门手册

3. Python面向对象视频教程

Das obige ist der detaillierte Inhalt vonPython Capture reguläre Ausdrücke. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn