Python 正则表达式

正则表达式

没有激流就称不上勇进,没有山峰则谈不上攀登。–佚名

正则表达式

正则表达式自己有一套规则,他可以通过一些规则来筛选出正确的结果

学到很多东西的诀窍,就是一下子不要学很多。——洛克

流程概述

(1) 创建正则表达式对象

  • 使用正则表达式之前,必须借助 re 模块,否则在 Python 中使用不了正则表达式

import re

(2) 匹配 Regex 对象

  • 必须使用 compile(r’规则’) 设定规则

import re

regex = re.compile(r"Python")

(3)通过规则来找到结果

  • 必须使用 search()

import re


str = "今天我开始学习Python222222222"

regex = re.compile(r"Python")

match = regex.search(str)


# 结果

# 找不到的话就是None

# 找的到的话就是类型就是 <class 're.Match'>

(4) 找到结果的时候通过 group()来输出结果

  • group() 来输出结果

str = "今天我开始学习Python222222222"

regex = re.compile(r"Python")

match = regex.search(str)

result = match.group()

print(result)

完整版


import re

str = "今天我开始学习Python222222222"
regex = re.compile("Python")

match = regex.search(str)
print(match)  # 找不到就是None
if match:
    result = match.group()
    print(result)
else:
    print("没有筛选到")

总结

  • 使用 import re 引入正则模块

  • 使用 re.compile() 设定规则

  • 向 Regex 对象的 search()方法传入想要找的字符串,它返回一个 Match 对象

  • 调用 Match 对象的 group()方法 返回实际匹配文本的字符串

用正则表达式匹配更多模式

利用括号分组

  • 举例子 \d 表示查找数字 加了括号他的顺序就是从 1 开始

import re

str = 'My number is 415-555-4242'

regex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')

match = regex.search(str)


result0 = match.group(0)

result1 = match.group(1)

result2 = match.group(2)


print(result0)

print(result1)

print(result2)

# 结果

# 415-555-4242
# 415
# 555-4242

用管道匹配多个分组

字符 | 称为 管道 希望匹配许多表达式中的一个时 就可以用它

  • 他是条件满足一个就行,谁写在前面就满足谁

import re

str = 'Black and White'

regex = re.compile(r'Black|White')

match = regex.search(str)

result = match.group()

result2 = match.group(2)

print(result)

print(result2)

# 结果就是Black

# 要是把White 写在前面的话

# 结果就是White

用问号可以实现选配

  • 用问号可以实现选配 就是无论满足不满足 正则都会认为满足

import re

str = 'Blackwoman'

str2 = 'Blackman'


def reg(str):

    regex = re.compile(r'Black(wo)?man')
    match = regex.search(str)
    result = match.group()
    print(result)


reg(str)

reg(str2)

# 结果

# Blackwoman

# Blackman

用星号匹配零次或者多次(找不到也没关系)


import re

str = 'Blackman'

str2 = 'Blackwowowowowoman'


def reg(str):

    regex = re.compile(r'Black(wo)*man')
    match = regex.search(str)
    result = match.group()
    print(result)


reg(str)

reg(str2)

# 结果

# Blackman

# Blackwowowowowoman

用加号匹配 1 次或者多次


import re

str = 'Blackman'

str2 = 'Blackwowowowowoman'


def reg(str):

    regex = re.compile(r'Black(wo)+man')
    match = regex.search(str)
    if match:
        result = match.group()
        print(result)
    else:
        print("没有结果")


reg(str)

reg(str2)

# 结果

# 没有结果

# Blackwowowowowoman

用花括号匹配特定的次数

  • 如果一个分组想要重复特定的次数,就在正则表达式中该分组的后面,跟上花括号包围的数字例如(Ha){3} 就表示 HaHaHa 但是它不会匹配’HaHa’

  • 除了一个数字,还可以指定一个范围,即在花括号中写下一个最小值,一个逗号和一个最大值,例如(Ha){1,3} 它就会匹配 ‘Ha’, ‘HaHa’,’HaHaHa’


import re

str = 'Ha'

str2 = 'HaHaHa'

str3 = 'HaHaHaHaHa'


def reg(str):

    regex = re.compile(r'(Ha){1,5}')
    match = regex.search(str)
    if match:
        result = match.group()
        print(result)
    else:
        print("没有结果")


reg(str)

reg(str2)

reg(str3)

# 结果

# Ha

# HaHaHa

# HaHaHaHaHa

贪心和非贪心模式

  • 在 Python 中正则表达式默认是贪心的,也就是他会找出来最多的比如(Ha){3,5} 他会找出了符合最长的而不是最短的

import re


str3 = 'HaHaHaHaHa'


def reg(str):

    regex = re.compile(r'(Ha){1,5}')
    match = regex.search(str)
    if match:
        result = match.group()
        print(result)
    else:
        print("没有结果")


reg(str3)

# 结果

# HaHaHaHaHa
  • 如果你不想进贪心模式,你就想找到最短的,只有?来解决

import re


str3 = 'HaHaHaHaHa'


def reg(str):

    regex = re.compile(r'(Ha){1,5}?')
    match = regex.search(str)
    if match:
        result = match.group()
        print(result)
    else:
        print("没有结果")


reg(str3)

# 结果
# Ha

所以在 Python 正则表达式中,问号有两种含义 生命表示可选的分组 或者 声明非贪心模式

findall() 方法

  • 除了 search()方法还有一个 findall()方法.search()返回的是一个 Match()对象,而 findall()返回的是一组字符串,包含被查找字符串中的所有匹配

  • findall 就三步 没有 group,结果是个数组


import re


str3 = 'HaHaHaHaHa'


def reg(str):

    regex = re.compile(r'(Ha){1,5}?')
    match = regex.findall(str)
    print(match)


reg(str3)

# 结果

# ['Ha', 'Ha', 'Ha', 'Ha', 'Ha']

规则分类


\d 0到9的数字

\D 除0到9的数字以外的任何字符

\w 任何字母,数字,下划线

\W 除任何字母,数字,下划线以外的任何字符

\s 空格 制表符 换行符(可以认为匹配空白字符)

\S 除空格 制表符 或换行符以外的任意字符

> 大写就表示取反

插入字符和美元字符

  • ^ 表示以什么开头的

  • $ 表示以什么结尾的


import re


str3 = '12121212121'


def reg(str):

    regex = re.compile(r'^\d+$')
    match = regex.search(str)
    result = match.group()
    print(result)


reg(str3)

# 结果

# 12121212121

通配字符

  • python 中 (.)句号 代表通配符,它匹配除了换行之外的所有字符

  • 要是匹配真正的.前面需要加转义\


import re


str3 = 'Hellodada'


def reg(str):

    regex = re.compile(r'.d')
    match = regex.findall(str)
    print(match)


reg(str3)

# 结果

# ['od','ad']

用点-星匹配所有字符

  • 有的时候匹配所有字符(.*) 表示任意文本

import re


str3 = 'Hello dada'


def reg(str):

    regex = re.compile(r'(.*) (.*)')
    match = regex.findall(str)
    print(match)


reg(str3)

# 结果

# [('Hello', 'dada')]
  • re.DOTALL 匹配所有字符,包括换行符,全部匹配

import re


str3 = 'Server the public trust .\nprotect the woman .\nUpload the law'


def reg(str):

    regex = re.compile('.*', re.DOTALL)
    match = regex.findall(str)
    print(match)


reg(str3)

# 结果

# 'Server the public trust .\nprotect the woman .\nUpload the law'

替换 sub()


import re


str3 = 'Server the public woman'


def reg(str):

    regex = re.compile('woman', re.DOTALL)
    result = regex.sub('女人', str3)
    print(result)


reg(str3)

# 结果

# Server the public 女人

忽略字符串中的空白符和注释

  • r 后面必须有 3 个引号 结尾也必须 3 个引号

  • 传入第二个参数 re.VERBOSE


import re


str3 = 'Server the public woman'


def reg(str):

    regex = re.compile(r'''(woman)#忽略注释''', re.VERBOSE)
    match = regex.search(str3)
    result = match.group()
    print(result)


reg(str3)

# 结果

# woman

组合版本


import re


str3 = 'Server the public woman'


def reg(str):

    regex = re.compile(r'''(woman)#忽略注释''', re.VERBOSE|re.DOTALL)
    match = regex.search(str3)
    result = match.group()
    print(result)


reg(str3)

# 结果

# woman

文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录