Python正则表达式的七个利用典型
作为一个观念而言,正则表达式对付Python来说并不是独占的。可是,Python中的正则表达式在实际利用进程中照旧有一些细小的不同。
本文是一系列关于Python正则表达式文章的个中一部门。在这个系列的第一篇文章中,我们将重点接头如何利用Python中的正则表达式并突出Python中一些独占的特性。
我们将先容Python中对字符串举办搜索和查找的一些要领。然后我们讲接头如何利用分组来处理惩罚我们查找到的匹配工具的子项。
我们有乐趣利用的Python中正则表达式的模块凡是叫做‘re'。
>>> import re
1. Python中的原始范例字符串
Python编译器用‘\'(反斜杠)来暗示字符串常量中的转义字符。
假如反斜杠后头随着一串编译器可以或许识此外非凡字符,那么整个转义序列将被替换成对应的非凡字符(譬喻,‘\n'将被编译器替换成换行符)。
但这给在Python中利用正则表达式带来了一个问题,因为在‘re'模块中也利用反斜杠来转义正则表达式中的非凡字符(好比*和+)。
这两种方法的殽杂意味着有时候你不得不转义转义字符自己(当非凡字符能同时被Python和正则表达式的编译器识此外时候),但在其他时候你不必这么做(假如非凡字符只能被Python编译器识别)。
与其将我们的心思放在去弄懂到底需要几多个反斜杠,我们可以利用原始字符串来替代。
原始范例字符串可以简朴的通过在普通字符串的双引号前面加一个字符‘r'来建设。当一个字符串是原始范例时,Python编译器不会对其实验做任何的替换。本质上来讲,你在汇报编译器完全不要去过问干与你的字符串。
>>> string = 'This is a\nnormal string' >>> rawString = r'and this is a\nraw string' >>> print string
这是一个普通字符串
>>> print rawString and this is a\nraw string
这是一个原始范例字符串。
在Python中利用正则表达式举办查找
‘re'模块提供了几个要领对输入的字符串举办确切的查询。我们将会要接头的要领有:
•re.match() •re.search() •re.findall()
每一个要领都吸收一个正则表达式和一个待查找匹配的字符串。让我们更具体的查察这每一个要领从而弄大白他们是如何事情的以及他们各有什么差异。
2. 利用re.match查找 – 匹配开始
让我们先来看一下match()要领。match()要领的事情方法是只有当被搜索字符串的开头匹配模式的时候它才气查找到匹配工具。
举个例子,对字符串‘dog cat dog'挪用mathch()要领,查找模式‘dog'将会匹配:
>>> re.match(r'dog', 'dog cat dog') <_sre.SRE_Match object at 0xb743e720< >>> match = re.match(r'dog', 'dog cat dog') >>> match.group(0) 'dog'
我们稍后将更多的接头group()要领。此刻,我们只需要知道我们用0作为它的参数挪用了它,group()要领返回查找到的匹配的模式。
我还暂且略过了返回的SRE_Match工具,我们很快也将会接头到它。
可是,假如我们对同一个字符串挪用math()要领,查找模式‘cat',则不会找到匹配。
>>> re.match(r'cat', 'dog cat dog') >>>
3. 利用re.search查找 – 匹配任意位置
search()要领和match()雷同,不外search()要领不会限制我们只从字符串的开头查找匹配,因此在我们的示例字符串中查找‘cat'会查找到一个匹配:
search(r'cat', 'dog cat dog') >>> match.group(0) 'cat'
然而search()要了解在它查找到一个匹配项之后遏制继承查找,因此在我们的示例字符串顶用searc()要领查找‘dog'只找到其首次呈现的位置。
>>> match = re.search(r'dog', 'dog cat dog') >>> match.group(0) 'dog'
4. 利用 re.findall – 所有匹配工具
今朝为止在Python中我利用的最多的查找要领是findall()要领。当我们挪用findall()要领,我们可以很是简朴的获得一个所有匹配模式的列表,而不是获得match的工具(我们会在接下来更多的接头match工具)。对我而言这越发简朴。对示例字符串挪用findall()要领我们获得:
['dog', 'dog'] >>> re.findall(r'cat', 'dog cat dog') ['cat']
5. 利用 match.start 和 match.end 要领
那么,先前search()和match()要领先前返回给我们的‘match'工具”到底是什么呢?
和只简朴的返回字符串的匹配部门差异,search()和match()返回的“匹配工具”,实际上是一个关于匹配子串的包装类。
#p#分页标题#e#
先前你看到我可以通过挪用group()要领获得匹配的子串,(我们将在下一个部门看到,事实上匹配工具在处理惩罚分组问题时很是有用),可是匹配工具还包括了更多关于匹配子串的信息。
譬喻,match工具可以汇报我们匹配的内容在原始字符串中的开始和竣事位置:
>>> match = re.search(r'dog', 'dog cat dog') >>> match.start() >>> match.end()
知道这些信息有时候很是有用。
6. 利用 mathch.group 通过数字分组
就像我之前提到的,匹配工具在处理惩罚分组时很是驾轻就熟。
分组是对整个正则表达式的特定子串举办定位的本领。我们可以界说一个分组做为整个正则表达式的一部门,然后单独的对这部门对应匹配到的内容定位。
让我们来看一下它是怎么事情的:
>>> contactInfo = 'Doe, John: 555-1212'
我适才建设的字符串雷同一个从或人的地点本里取出来的一个片断。我们可以通过这样一个正则表达式来匹配这一行:
>>> re.search(r'\w+, \w+: \S+', contactInfo) <_sre.SRE_Match object at 0xb74e1ad8<
通过用圆括号来(字符‘('和‘)')困绕正则表达式的特定部门,我们可以对内容举办分组然后对这些子组做单独处理惩罚。
>>> match = re.search(r'(\w+), (\w+): (\S+)', contactInfo)
这些分组可以通过用分组工具的group()要领获得。它们可以通过其在正则表达式中从左到右呈现的数字顺序来定位(从1开始):
>>> match.group(1) 'Doe' >>> match.group(2) 'John' >>> match.group(3) '555-1212'
组的序数从1开始的原因是因为第0个组被预留来存放所有匹配工具(我们在之前进修match()要领和search()要领到时候看到过)。
>>> match.group(0) 'Doe, John: 555-1212'
7. 利用 match.group 通过别名来分组
有时候,出格是当一个正则表达式有许多分组的时候,通过组的呈现序次来定位就会变的不现实。Python还答允你通过下面的语句来指定一个组名:
>>> match = re.search(r'(?P<last>\w+), (?P<first>\w+): (?P<phone>\S+)', contactInfo)
我们照旧可以用group()要领获取分组的内容,但这时候我们要用我们所指定的组名而不是之前所利用的组的地址位数。
>>> match.group('last') 'Doe' >>> match.group('first') 'John' >>> match.group('phone') '555-1212'
这大大增强了代码的明晰性和可读性。你可以想像当正则表达式变得越来越巨大,去弄懂一个分组到捕捉了什么内容将会变得越来越坚苦。给你的分组定名将明晰的汇报了你和你的读者你的意图。
尽量findall()要领不返回分组工具,它也可以利用分组。雷同的,findall()要领将返回一个元组的荟萃,个中每个元组中的第N个元素对应了正则表达式中的第N个分组。
>>> re.findall(r'(\w+), (\w+): (\S+)', contactInfo) [('Doe', 'John', '555-1212')]
可是,给分组定名并不合用于findall()要领。
在本文中我们先容了Python中利用正则表达式的一些基本。我们进修了原始字符串范例(尚有它能帮你办理的在利用正则表达式中一些头痛的问题)。我们还进修了如何适利用match(), search(), and findall()要领举办根基的查询,以及如何利用分组来处理惩罚匹配工具的子组件。
和往常一样,假如想查察更多关于这个主题的内容,re模块的Python官方文档是一个很是好的资源。
在今后的文章中,我们将更深入的接头Python中正则表达式的应用。我们将越发全面的进修匹配工具,进修如何利用它们在字符串中做替换,甚至利用它们从文本文件中去理会Python数据布局。