Python正则表达式的七个使用范例
正则表达式作为一个概念,对于Python来说并不是独一无二的。然而,Python中的正则表达式在实际使用过程中仍存在一些细微差异。
本文是一系列关于Python正则表达式文章的一部分。在本系列的第一篇文章中,我们将重点讨论如何使用Python中的正则表达式,并突出Python中的一些独特特征。
我们将介绍一些在Python中搜索和搜索字符串的方法。然后我们讨论如何使用分组来处理我们找到的匹配对象的子项。
对Python中正则表达式模块感兴趣的通常被称为‘re'。
>>>importre
1. Python中的原始类型字符串
Python编译器“\'(反斜杠)表示字符串常量中的转义字符。
如果反斜杠后面有一串编译器可以识别的特殊字符,则整个转义序列将被相应的特殊字符替换(例如,‘\n'用换行符代替被编译器)。
但这给Python中使用正则表达式带来了一个问题,因为在‘re'正则表达式中的特殊字符(如*和+)也用反斜杠在模块中转义。
这两种方法的混合意味着有时你必须转换转义字符本身(当特殊字符可以同时被Python和正则表达式编译器识别时),但你不必在其他时候这样做(如果特殊字符只能由Python编译器识别)。
我们可以用原始字符串代替,而不是把心思放在了解需要多少反斜杠上。
原始类型的字符串可以简单地在普通字符串的双引号前添加一个字符。r'创建。当字符串是原始类型时,Python编译器不会尝试更换它。本质上,你告诉编译器不要干涉你的字符串。
>>>string='Thisisa\nnormalstring' >>>rawString=r'andthisisa\nrawstring' >>>printstring
这是一个普通的字符串
>>>printrawString andthisisa\nrawstring
这是一个原始类型的字符串。
在Python中使用正则表达式进行搜索
‘re'该模块提供了几种准确查询输入字符串的方法。我们将讨论的方法是:
•re.match() •re.search() •re.findall()
每种方法都接收一个正则表达式和一个匹配的字符串。让我们更详细地查看每种方法,以了解它们是如何工作的,以及它们之间的区别。
2. 使用re.match搜索 – 匹配开始
让我们先来看看match()方法。match()方法的工作方法是只有在搜索字符串的开始匹配模式时才能找到匹配对象。
例如,字符串“dog cat dog'调用mathch()方法,查找模式‘dog'将会匹配:
>>>re.match(r'dog','dogcatdog') <_sre.SRE_Matchobjectat0xb73e7< >>>match=re.match(r'dog','dogcatdog') >>>match.group(0) 'dog'
以后我们会讨论更多的group()方法。现在,我们只需要知道我们用0作为它的参数,group()方法返回找到的匹配模式。
我暂时跳过了SRE_Match的回归对象,我们很快就会讨论它。
但是,如果我们调用math()方法对同一个字符串进行搜索模式‘cat',找不到匹配。
>>>re.match(r'cat','dogcatdog') >>>
3. 使用re.搜索search – 匹配任何位置
search()方法类似于match(),但search()方法不会限制我们只从字符串的开头找到匹配,所以在我们的示例字符串中找到‘cat'找一个匹配:
search(r'cat','dogcatdog') >>>match.group(0) 'cat'
然而,search()方法将在找到匹配项后停止搜索,因此在我们的示例字符串中使用searc()方法搜索“dog'只找到它第一次出现的位置。
>>>match=re.search(r'dog','dogcatdog') >>>match.group(0) 'dog
4. 使用 re.findall – 所有匹配对象 到目前为止,我在Python中使用最多的搜索方法是findall()方法。当我们调用findall()方法时,我们可以非常简单地获得所有匹配模式的列表,而不是获得match对象(我们将在未来讨论更多的match对象)。这对我来说更简单。我们可以通过调用findall()来获得示例字符串:
['dog','dog'] >>>re.findall(r'cat','dogcatdog') ['cat']
5. 使用 match.start 和 match.end 方法
所以,先前的search()和match()方法已经回到了我们的‘match'对象到底是什么?
不同于简单返回字符串的匹配部分,search()与match()返回的“匹配对象”实际上是一个关于匹配子串的包装类别。
之前你看到我可以通过调用group()获得匹配的子串(我们将在下一部分看到,匹配对象在处理分组问题时实际上非常有用),但匹配对象也包含了更多关于匹配子串的信息。
例如,match对象可以告诉我们原始字符串中匹配的内容的开始和结束:
>>>match=re.search(r'dog','dogcatdog') >>>match.start() >>>match.end()
有时候知道这些信息很有用。
6. 使用 mathch.group 通过数字分组
正如我之前提到的,匹配对象在处理分组时非常得心应手。
分组是定位整个正则表达式特定子串的能力。我们可以定义一个小组作为整个正则表达式的一部分,然后单独定位与这部分相匹配的内容。
让我们看看它是如何工作的:
>>>contactInfo='Doe,John:555-1212'
我刚刚创建的字符串类似于从某人的地址簿中取出的片段。我们可以通过这样一个正则表达式来匹配这一行:
>>>re.search(r'\w+,\w+:\S+',contactInfo) <_sre.SRE_Matchobjectat0xb74ead8<
使用括号(字符(');和‘)')包围正则表达式的特定部分,我们可以分组内容,然后单独处理这些子组。
>>>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的数据结构。