项目小结(二)

续前节

这几天有点忙,写了一篇就没时间了,现在来补一补。上一篇记录了Python中的文件操作,这篇简单看一下Python中的正则表达式。

正则表达式

正则表达式为我们提供了一个极为便利而且强大的操作字符串的方法,可以从大段复杂的文字中提取出我们需要的信息,或者进行对字符串的较为复杂的内容替换操作。

相关库

要使用正则表达式,首先需要导入相关的re库。

import re

使用方法

为了匹配文本中我们需要的内容,需要一个匹配模式pattern,也就是我们所说的正则表达式。

p = re.compile(r'')

compile函数的参数就是正则表达式字符串。这个函数将会返回一个compile对象,它的findallfinditer方法最常用。p.findall()返回一个匹配结果的列表,p.finditer()返回一个迭代器。

元字符

普通的文本对于正则语法来说就是直接匹配,而有些特殊的字符,我们叫做元字符,出现在正则表达式中时就代表特殊的含义。

标识 含义
. 换行符外任意字符
* 匹配0次或多次
+ 匹配1次或多次
? 匹配0次或1次
\ 转义元字符
[] 匹配[]中的字符之一
^ 匹配文本开头
$ 匹配文本结尾
{} 指定匹配次数
` `
() 表示分组

此外,我们还有一些特殊的用法。

  • []里的^
    ^单独使用表示匹配文本的开头,但是用在[]中时,它表示匹配[]中字符之外的字符。例如[^123_]表示匹配除了1, 2, 3, _之外的所有字符。

  • 用\后接字母表示某一类型的字符
    这个用法与格式化字符串有点相似,不过用的是\而不是%,而且含义也不尽相同。具体可见下表。

标识 含义
\d 匹配0-9,等价于[0-9]
\w 匹配大小写字母,数字,下划线,等价于[a-zA-Z0-9_]
\s 匹配空白字符,\t\n等等
\D 等价于[^0-9]
\W 等价于[^a-zA-Z0-9_]
\S 匹配非空白字符

小写字母变成大写字母相当于取补集。

  • 贪婪模式和非贪婪模式
    最直观的例子是匹配HTML标签。例如对下面的文本进行匹配:

    <head><title>Page Title</title></head>
    

    如果我们直接用<.*>来匹配,那么得到的结果将是原始的所有文本:<head><title>Page Title</title></head>。原因就是*, +, ?这些元字符都是贪婪模式,意思就是会匹配尽可能多的文本。
    如果使用<.*?>来匹配,我们使用的是非贪婪模式,那么我们将会得到正确的结果:<head>, <title>, </title>, </head>

  • 单行和多行模式,.匹配换行符,大小写区分
    在我们需要匹配的字符串中出现换行时,最好要指定匹配是单行模式还是多行模式。单行模式下,^, $匹配整个文本的开头或结尾;多行模式下,^, $匹配每行的开头和结尾,结果不尽相同。这个属性可以用compile函数的参数re.MULTILINE, re.M来表示。
    某些情况下,我们需要让.能够匹配换行符。用上一个例子来说,如果原始文本是这样的,

    <head>
    <title>Page Title</title>
    </head>
    

    那么<.*>匹配的结果将不再是整个文本,而是<head>, <title>Page Title</title>, </head>,原因是.不能匹配换行符。如果我们指定compile函数的参数re.DOTALL, re.S.将能够匹配换行符,此时匹配的结果就会是整个文本。
    匹配默认是区分大小写的,若要设置不区分大小写,需要指定compile函数的参数re.IGNORECASE, re.I

    若要同时指定多个修正参数,用|连接即可,例如

    p = re.compile(r'', re.M | re.S | re.I)
    
  • 给不同的组命名
    当使用()来分组时,尤其是有多个组的时候,可以给每个组命名,这样便于之后的提取和处理不同的内容。
    使用方法是在()中开头位置加上?P<name>name,这就是这个组的名字。但是想要通过名字来获取匹配到的内容,就需要用p.finditer()方法,因为findall()方法返回的是一个列表,里面的元素是元组,没有名字的属性,因此不能通过设定的名字调用。

    for match in p.finditer(content):
        name = match.group('name')
    

字符串替换

对于字符串替换,我们通常使用replace()方法,但是这个方法只能进行简单的替换处理,当问题复杂时,可以用re库的sub()方法。

re.sub(r'' # 正则表达式字符串
       , '' # 替换成的内容
       , str # 源字符串
       )

这将返回完成替换操作后的新字符串。

实用工具

安利一个学习正则表达式的网站,regex101.com,支持多种语言,还能一键生成代码,最关键的是可视化做得非常好,能很难直观的看到自己的正则表达式的工作流程和问题所在,是学习正则和调试debug的实用工具。

未完待续

posted @ 2020-08-05 17:34  Baoding_LIU  阅读(56)  评论(0)    收藏  举报