Python模块:re模块(正则表达式)

  • Post author:
  • Post category:python


在这里插入图片描述



一、什么是正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。​


正则表达式的​特点:

  1. 灵活性、逻辑性和功能性非常强;
  2. 可以迅速地用极简单的方式达到字符串的复杂控制。
  3. 对于刚接触的人来说,比较晦涩难懂。



二、正则表达式的匹配


(1)单个字符匹配


在这里插入图片描述

  • 有些特殊字符在[ ]中被赋予新的特殊含义,如

    ^

    出现在

    []

    中的开始位置表示取反,它出现在

    []

    中的其他位置表示其一个普通字符
  • 有的普通字符变为特殊字符,如

    -



    [ ]

    中的位置不是第一个字符则表示一个数字或字母区间,如果在

    [ ]

    中的位置是第一个字符则表示其本身(一个普通字符)


  • [ ]

    中,如果要使用

    -

    ,

    ^



    ]

    ,可在在它们前面加上反斜杠,例如

    [\^]


(2)匹配边界


在这里插入图片描述


(3)重复次数


| ?    | 0或1,要么出现,要么不出现 |
| ----- | -------------------------- |
| *     | 0-多次                     |
| +     | 1-多次,至少一次           |
| {n,}  | 大于等于n次                |
| {n,m} | 大于等于n次小于等于m次     |
| {n}   | 重复n次                    |

说明: {m,n}中的m和n可以省略其中一个,{,n}相当于{0,n},{m,}相当于{m,整数最大值}。


(4)预定义字符集

在这里插入图片描述


(5)逻辑分组


在这里插入图片描述



三、python中re模块的使用

# 模块
import re   


# 方法
match.group() #返回匹配对象
match.group(0)#获取匹配结果,结果同上
match.span() #获取匹配范围
match.start() #匹配开始位置
match.end() #匹配结束位置

举例

import re

# 1.将正则表达式编译成一个pattern对象
pattern = re.compile('\d+')

# 2.匹配字符串
str = '12hello 456,a;b'
m1 = pattern.match(str)

# 3.获取
print(m1)  # <_sre.SRE_Match object; span=(0, 2), match='12'>
print(m1.group())  # 12
print(m1.span())  # (0, 2)
print(m1.start())  # 0
print(m1.end())  # 2



四、re模块常用方法


1)re.compile()

该方法用来生成正则表达式对象,其语法格式如下:
regex=re.compile(pattern,flags=0)

参数说明:
pattern:正则表达式对象。
flags:代表功能标志位,扩展正则表达式的匹配。


2) re.findall()

根据正则表达式匹配目标字符串内容。
re.findall(pattern,string,flags=0)

该函数的返回值是匹配到的内容列表,如果正则表达式有子组,则只能获取到子组对应的内容。
参数说明如下:
pattern:正则表达式对象。
string:目标字符串
flags:代表功能标志位,扩展正则表达式的匹配。


3) regex.findall()

该函数根据正则表达式对象匹配目标字符串内容。其语法格式如下:
regex.findall(string,pos,endpos)

参数说明:
string 目标字符串。
pos 截取目标字符串的开始匹配位置。
endpos 截取目标字符串的结束匹配位置。


4) re.split()

该函数使用正则表达式匹配内容,切割目标字符串。返回值是切割后的内容列表。参数说明:
re.split(pattern,string,flags = 0)

参数说明:
pattern:正则表达式。
string:目标字符串。
flags:功能标志位,扩展正则表达式的匹配。


5) re.sub

该函数使用一个字符串替换正则表达式匹配到的内容。返回值是替换后的字符串。其语法格式如下:
re.sub(pattern,replace,string,max,flags = 0)

其参数说明:
pattern:正则表达式。
replace:替换的字符串。
string:目标字符串。
max:最多替换几处,默认替换全部
flags:功能标志位,扩展正则表达式的匹配。


6) re.search()

匹配目标字符串第一个符合的内容,返回值为匹配的对象。语法格式如下:
re.search(pattern,string,flags=0)

参数说明:
pattern:正则表达式
string:目标字符串


使用注意:


在平时的使用中,我们一般不使用re.compile方法,因为在源码中已经自动调用该方法

在这里插入图片描述

而其他的函数例如findall,search这些方法也都是自动调用该方法的

在这里插入图片描述



五、flags功能标志位

功能标志位的作用是扩展正则表达的匹配功能。常用的 flag 如下所示:

缩写元字符 说明
A 元字符只能匹配 ASCII码。
I 使匹配对大小写不敏感
S 使 . 匹配包括换行在内的所有字符
M 多行匹配,影响 ^ 和 $

注意:可以同时使用福多个功能标志位,比如

flags=re.I|re.S



六、正则表达式中的分组

分组时通过

()

来表示的,一个括号就表示一个分组。


分组的作用

1)筛选特定内容。
取分组内容可以通过match对象的group方法来去。
group(1)表示取正则表达式中第一个括号的内容,依次类推。

import re
content = '{name:"zhangsan",age:"10",hobby["basktball","football","read"]}'
pattern = re.compile(r'{name:"(\w+)",age:"(\d+)".+')
match = pattern.search(content)
print(match.group(1))#zhangsan
print(match.group(2))#10


--------------------------------------------------------------------2)可以在同一个表达式的后面引用前面的分组表达式。

s = "<html><h1>正则表达式</h1></html>"

import re

s = "<html><h1>正则表达式</h1></html>"
pattern = re.compile(r'<(html)><(h1)>(.*)</\2></\1>')
match = pattern.search(s)
print(match.group(3)))#正则表达式



七、贪婪和非贪婪模式

  • 贪婪是用

    *

    控制的
  • 非贪婪是用?来控制

  • *



    ?

    都是作用表示重复次数的元字符的。
  • 正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪。
  • 在表示重复的元字符后面加一个

    ?

    ,此时就是非贪婪,取这个重复元字符的最小值。



八、通用匹配正则表达式



.*?

配合re.S,即:匹配包括换行在内的所有字符

import re

content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}'
pattern = re.compile(r'.*?"(.*?)".*?"(.*?)".*?',re.S)
match = pattern.search(content)
print(match)
print(match.group(1))
print(match.group(2))

在这里插入图片描述



九、使用正则的一些处理实例


1.去掉英文符号

import string


def remove_english_punctuation(text):
    """去除所有英文符号"""
    punctuation_string = string.punctuation
    # print("所有的英文标点符号:", punctuation_string)
    for i in punctuation_string:
        text = text.replace(i, '')
    return text


2.去掉中文符号

from zhon.hanzi import punctuation


def remove_chinese_punctuation(text):
    punctuation_str = punctuation
    # print("中文标点符合:", punctuation_str)
    for i in punctuation_str:
        text = text.replace(i, '')
    return text


3.去掉h5标签

def data_cleaning(content):
    """
    内容数据清洗,去除文字中的H5代码
    """
    Cstr = content
    result = re.findall(r'<.*?>', Cstr)
    for r in result:
        Cstr = Cstr.replace(r, '')
    return Cstr.replace('\n', '').replace('\t', '').replace('\r', '')