Day16 正则表达式

文章目录

  • Day16 正则表达式
    • 1. 认识正则
    • 2. 匹配类符号
      • 2.1 什么是正则表达式
      • 2.2 python的re模块
      • 2.3 正则语法 - 匹配类符号
    • 3. 匹配次数
      • 3.1 *:0次或多次(任意次数)
      • 3.2 + : 匹配多次有关字符(至少1次)
      • 3.3 ? - 0次或1次
      • 3.4 {}
      • 3.5 练习
    • 4. 贪婪和非贪婪
      • 4.1 贪婪和非贪婪
      • 4.2 示例
    • 5. 分组和分支
      • 5.1 分组 - ()
      • 5.2 分支 - |
    • 6. 转义字符
      • 6.1 转义字符
      • 6.2 [ ]里面的转义符号
    • 7. 检测类符号
      • 7.1 \b - 检测是否是单词边界
      • 7.2 \B - 检测是否不是单词边界
      • 7.3 ^ - 检测是否是字符串开头
      • 7.4 $ - 检测是否是字符串结尾
    • 8. re模块常用函数
      • 8.1 常用函数
      • 8.2 匹配对象
      • 8.3 参数

1. 认识正则

正则表达式是一种可以让一些复杂的问题变得简单的工具。
正则表达式和日常代码比较优势

示例1:判断指定的字符串是否是一个合法的手机号
手机号要求:11位数字,第1为必须是1.第2位是3~9

# 日常代码
tel = input('请输入您的手机号:')def Is_tel(num: str):if len(num) != 11:return Falsefor x in num:if not x.isdigit():return Falseif num[0] != '1':return Falseif '3' <= num[1] <= '9':return Truereturn Falseprint(Is_tel(tel))

请输入您的手机号:18745658994
True

# 用正则表达式
def is_tel2(num: str):from re import fullmatchreturn bool(fullmatch(r'1[3-9]\d{9}', num))print(is_tel2(tel))

请输入您的手机号:18745658994
True

示例2:提取字符串中所有的数字子串

str1 = '月薪: 25360元, 年龄18岁。身高:175,体重120斤。23'
# ['25360', '18', '175', '120']# 方法一:
result = []
temp = ''
for x in str1:if x.isdigit():temp += xelse:if temp:result.append(temp)temp = ''if temp:result.append(temp)print(result)

[‘25360’, ‘18’, ‘175’, ‘120’, ‘23’]

# 方法二:
from re import findall
result = findall(r'\d+', str1)
print(result)

[‘25360’, ‘18’, ‘175’, ‘120’, ‘23’]

2. 匹配类符号

2.1 什么是正则表达式

正则表达式是一种可以让复杂的字符串问题变得简单的工具;
正则并不是python特有的语法(不属于Python),所有的高级编程语言都支持正则,正则的语法通用。

不管通过正则表达式解决的是什么问题,写正则的时候都是使用正则表达式描述字符串规则。

2.2 python的re模块

re模块是python用来支持正则表达式的一个模块,模块中包含了所有和正则相关的函数。

fullmatch(正则表达式,字符串)
判断正则表达式和指定的字符串是否完全匹配(判断整个字符串是否符合正则表达式所描述的规则);
如果匹配成功返回匹配对象,匹配失败返回None

2.3 正则语法 - 匹配类符号

from re import fullmatch

1)普通字符(普通符号) - 正则表达式中表示符号本身的符号

result = fullmatch(r'abc', 'abc')
print(result)

<re.Match object; span=(0, 3), match=‘abc’>

2) . : 匹配任意一个字符

result = fullmatch(r'a.c', 'a好c')
print(result)# result = fullmatch(r'a*c', 'a好的c')
# print(result)  # None

<re.Match object; span=(0, 3), match=‘a好c’>

3)\d : 匹配任意一个数字字符

result = fullmatch(r'a\d\dc', 'a21c')
print(result)

<re.Match object; span=(0, 4), match=‘a21c’>

4)\s : 匹配任意一个空白字符
空白字符 - 能产生空白效果的字符,列如:空格、换行、水平制表符

result = fullmatch(r'a\sc', 'a c')
print(result)# result = fullmatch(r'a\sc', 'ac')
# print(result)  # 若ac之间没有空格,是空的话就返回:None

<re.Match object; span=(0, 3), match=‘a c’>

5)\D : 匹配任意一个非数字字符

result = fullmatch(r'a\Dc', 'a c')
print(result)# result = fullmatch(r'a\Dc', 'a5c')
# print(result)  # None

<re.Match object; span=(0, 3), match=‘a c’>

6)\S : 匹配任意一个非空白字符

result = fullmatch(r'a\Sc', 'a你c')
print(result)# result = fullmatch(r'a\Sc', 'a c')
# print(result)  # None

<re.Match object; span=(0, 3), match=‘a你c’>

7)[字符集] - 匹配字符集中的任意一个字符

[abc] —— 匹配a或者b或者c
[abc\d] —— 匹配a或者b或者c或者任意的一个数字
[1-9] —— 匹配1到9中的任意一个数字
[a-z] —— 匹配任意一个小写字母
[A-Z] —— 匹配任意一个大写字母
[a-zA-Z] —— 匹配任意一个字母
[a-zA-Z\d_] —— 匹配字母数字下划线
[\u4e00-\u9fa5] —— 匹配任意一个中文

注意:[ ]中减号放在两个字符之间,表示谁到谁(确定的方式是根据字符编码值大小确定的);如果减号不在两个字符之间,表示的就是一个普通的减号

result = fullmatch(r'a[\u4e00-\u9fa5]c', 'a淼c')
print(result)result = fullmatch(r'a[mn]c', 'anc')
print(result)# result = fullmatch(r'a[mn]c', 'amnc')
# print(result)  # None,只能是其中一个,两个不行# result = fullmatch(r'a[mn]c', 'a你c')
# print(result)  # None,中间字符必须是mn中的一个

<re.Match object; span=(0, 3), match=‘a淼c’>
<re.Match object; span=(0, 3), match=‘anc’>

8)[^字符集] - 匹配不在字符集中的任意一个字符

result = fullmatch(r'a[mn]c', 'amc')
print(result)# result = fullmatch(r'a[^mn]c', 'anc')
# print(result)  # None# result = fullmatch(r'a[^mn]c', 'a好c')
# print(result)  # None

<re.Match object; span=(0, 3), match=‘amc’>

3. 匹配次数

3.1 *:0次或多次(任意次数)

注意:*在谁的后面控制的就是谁的次数

result = fullmatch(r'a*123', 'aaaaa123')
print(result)result = fullmatch(r'a\*123', 'a*123')  # \*就代表一个普通的*
print(result)result = fullmatch(r'\d*abc', '123465612abc')
print(result)

<re.Match object; span=(0, 8), match=‘aaaaa123’>
<re.Match object; span=(0, 5), match=‘a*123’>
<re.Match object; span=(0, 12), match=‘123465612abc’>

3.2 + : 匹配多次有关字符(至少1次)

result = fullmatch(r'a+123', 'aaaaa123')
print(result)result = fullmatch(r'a+123', 'a123')
print(result)# result = fullmatch(r'a+123', '123')
# print(result)  # None

<re.Match object; span=(0, 8), match=‘aaaaa123’>
<re.Match object; span=(0, 4), match=‘a123’>

3.3 ? - 0次或1次

result = fullmatch(r'a?123', 'a123')
print(result)result = fullmatch(r'a?123', 'aa123')
print(result)  # None

<re.Match object; span=(0, 4), match=‘a123’>
None

3.4 {}

{M,N} - M到N次
{M,} - M到无穷次
{,N} - 0到N次
{N} - N次

result = fullmatch(r'a{2}123', 'aa123')
print(result)result = fullmatch(r'a{2,9}123', 'aaaaaa123')
print(result)result = fullmatch(r'a{,2}123', '123')
print(result)

<re.Match object; span=(0, 5), match=‘aa123’>
<re.Match object; span=(0, 9), match=‘aaaaaa123’>
<re.Match object; span=(0, 3), match=‘123’>

3.5 练习

练习:写一个正则,判断输入的内容是否是一个合法的QQ号(长度是5~12位的数字,第一位不能是0)

QQ = input('请输入您的QQ:')
result = fullmatch(r'[1-9]{5,12}', QQ)
print(result)

QQ = input(‘请输入您的QQ:’)
result = fullmatch(r’[1-9]{5,12}', QQ)
print(result)

练习:判断输入的内容是否是一个合法的标识符(由字母、数字下划线组成,数字不能开头)

str1 = input('请输入一个由字母、数字下划线组成,数字不能开头的标识符:')
result = fullmatch(r'[a-zA-Z_][\da-zA-Z_]*', str1)
print(result)

请输入一个由字母、数字下划线组成,数字不能开头的标识符:hjik52_
<re.Match object; span=(0, 7), match=‘hjik52_’>

4. 贪婪和非贪婪

引入模块

from re import match

match(正则表达式,字符串) - 判断字符串开头是否符合正则表达还是描述的规则

result = match(r'\d{3}', '2345宿舍wsww')
print(result)

<re.Match object; span=(0, 3), match=‘234’>

4.1 贪婪和非贪婪

当匹配次数不确定的时候(*、+、?、{M,N}、{M,}、{,N}),匹配模式分为贪婪和非贪婪两种,默认是贪婪的。

贪婪和非贪婪:在匹配成功的时候有多种匹配结果,贪婪去最多次数对应的匹配结果, 非贪婪取最少次数对应的匹配结果 (匹配次数不确定的地方,有多种匹配方式都可以匹配成功,贪婪取最多次数, 非贪婪取最少次数)

  • 贪婪模式:*、+、?、{M,N}、{M,}、{,N}
  • 非贪婪模式:*?、+?、??、{M,N}?、{M,}?、{,N}?

4.2 示例

amb、amb计算b、amb计算bxxb

贪婪模式

result = match(r'a.+b', 'amb计算bxxbmn')
print(result)

<re.Match object; span=(0, 9), match=‘amb计算bxxb’>

非贪婪模式

result = match(r'a.+?b', 'amb计算bxxbmn')
print(result)

<re.Match object; span=(0, 3), match=‘amb’>

**注意:**如果匹配结果只有一种可能,那么贪婪和非贪婪的结果一样

result = match(r'a.+b', 'ambxx')
print(result)result = match(r'a.+?b', 'ambxx')
print(result)

<re.Match object; span=(0, 3), match=‘amb’>
<re.Match object; span=(0, 3), match=‘amb’>

5. 分组和分支

引入模块

from re import fullmatch, findall

findall(正则表达式, 字符串) - 获取字符串中所有满足正则表达式的子串

5.1 分组 - ()

1)整体 - 将正则表达式中的一部分作为一个整体进行相关操作
2)重复 - 可以在正则表达式中通过 \M 来重复它前面的第M个分组的匹配结果
3)捕获 - 只获取正则表达式中的分组匹配到的结果(分为手动捕获和自动捕获两种)

# '12MN34KL56UI89PO...'
result = fullmatch(r'(\d\d[A-Z]{2})+', '12MN22KL58PO')
print(result)

<re.Match object; span=(0, 12), match=‘12MN22KL58PO’>

# 23m23、98k98、12p12  -  能匹配
# 23m34、98k08   -   不能匹配
result = fullmatch(r'(\d{2})[a-z]\1', '23m23')
print(result)

<re.Match object; span=(0, 5), match=‘23m23’>

# 23mkj=mkj23
result = fullmatch(r'(\d{2})([a-z]{3})=\2\1{3}', '23mkl=mkl232323')
print(result)

<re.Match object; span=(0, 15), match=‘23mkl=mkl232323’>

# 提取message中金额对应的数字子串
message = '我今年18岁,月薪50000元,身高180,体重70公斤,8块腹肌。每年交300元的腾讯会员费。房贷每月3000元,车贷每月2200元。'
result = findall(r'(\d+)元', message)
print(result)

[‘50000’, ‘300’, ‘3000’, ‘2200’]

5.2 分支 - |

正则1|正则2|正则3|… —— 匹配可以和多个正则中任意一个正则匹配的字符串

# 匹配一个字符串是三个数字或者两个小写字母
result = fullmatch(r'\d{3}|[a-z]{2}', 'mk')
print(result)

<re.Match object; span=(0, 2), match=‘mk’>

# a234b、amjkb
result = fullmatch(r'a\d{3}b|a[a-z]{3}b', 'a232b')
print(result)

<re.Match object; span=(0, 5), match=‘a232b’>

# 注意:如果想要正则表达式中的一部分实现多选一的效果,变化的部分用分组表示
result = fullmatch(r'a(\d{3}|[a-z]{3})b', 'amklb')
print(result)result = fullmatch(r'你[\u4e00-\u9fa5]+|是[\u4e00-\u9fa5]+|是[\u4e00-\u9fa5]+|你是[\u4e00-\u9fa5]+', '你是爱是暖是希望')
print(result)

<re.Match object; span=(0, 5), match=‘amklb’>
<re.Match object; span=(0, 8), match=‘你是爱是暖是希望’>

6. 转义字符

6.1 转义字符

正则中的转义符号,在本身具备特殊功能或特殊意义的符号前加上’',让其变成一个普通符号。

# 匹配任意一个小数对应的字符串
result = fullmatch(r'\d+\.\d+', '123.321')
print(result)

<re.Match object; span=(0, 7), match=‘123.321’>

# +180 、+29000
result = fullmatch(r'\+\d+', '+180')
print(result)

<re.Match object; span=(0, 4), match=‘+180’>

6.2 [ ]里面的转义符号

# 单独存在有特殊意义的符号(+、*、?、.等),在[]中,特殊意义会自动消失
result = fullmatch(r'[a-zA-Z]+\?', 'Hello?')
print(result)

<re.Match object; span=(0, 6), match=‘Hello?’>

# 本身在[]中有特殊功能的符号,如果要表示普通符号还是必须加'\'
result = fullmatch(r'a[M\-N]b', 'a-b')
print(result)result = fullmatch(r'a[\^az]b', 'a^b')
print(result)

<re.Match object; span=(0, 3), match=‘a-b’>
<re.Match object; span=(0, 3), match=‘a^b’>

7. 检测类符号

引入模块

from re import fullmatch, findall

检测类符号是在匹配成功的情况下,检测检测类符号所在的位置是否符号相关要求

7.1 \b - 检测是否是单词边界

单词边界:可以将两个单词区分开的符号都是单词边界,比如:空白符号、英文标点符号、字符串开头和字符串结尾

result = fullmatch(r'abc\b mn', 'abc mn')
print(result)
# <re.Match object; span=(0, 6), match='abc mn'>message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'\d+', message)
print(result)
# ['203', '45', '89', '34', '23', '99', '910', '230', '90']result = findall(r'\d+\b', message)
print(result)
# ['45', '89', '23', '910', '230', '90']result = findall(r'\b\d+', message)
print(result)
# ['203', '89', '23', '99', '910', '230', '90']result = findall(r'\b\d+\b', message)
print(result)
# ['89', '23', '910', '230', '90']

7.2 \B - 检测是否不是单词边界

message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'\B\d+\B', message)
print(result)

[‘03’, ‘4’, ‘34’, ‘9’, ‘1’, ‘3’]

7.3 ^ - 检测是否是字符串开头

message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'^\d+', message)
print(result)

[‘203’]

# 提取字符串前5个字符
message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'^.{5}', message)
print(result)

[‘203mn’]

7.4 $ - 检测是否是字符串结尾

# 提取字符串最后5个字符
message = '203mn45,89 司机34kn;23;99mll==910,230 90='
result = findall(r'.{5}$', message)
print(result)

[‘0 90=’]

# '\2233'
result = fullmatch(r'\\\d+', '\92233')
print(result)

<re.Match object; span=(0, 6), match=‘\92233’>

8. re模块常用函数

引入模块

from re import *

8.1 常用函数

1) fullmatch(正则表达式, 字符串) —— 完全匹配,判断整个字符串是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空

result = fullmatch(r'\d{3}', '234')
print(result)

<re.Match object; span=(0, 3), match=‘234’>

2) match(正则表达式, 字符串) —— 匹配字符串开头,判断字符串开头是否符合正则表达式描述的规则,匹配成功返回匹配对象,匹配失败返回空

result = match(r'\d{3}', '823介绍数据库')
print(result)

<re.Match object; span=(0, 3), match=‘823’>

3) search(正则表达式, 字符串) —— 获取字符串中第一个能够和正则匹配的子串,能找到返回匹配对象,找不到返回空

result = search(r'\d{3}', 'ba203还是678说')
print(result)

<re.Match object; span=(2, 5), match=‘203’>

4) findall(正则表达式, 字符串) —— 获取字符串中所有满足正则的子串,返回一个列表,列表中的元素是字符串。
注意:如果正则表达式中有分组,会针对分组做自动捕获(只获取分组匹配到的结果)

result = findall(r'\d{3}', 'ba203还是678说kk0222jksn就是23311')
print(result)

[‘203’, ‘678’, ‘022’, ‘233’]

5) finditer(正则表达式, 字符串) —— 获取字符串中所有满足正则的子串,返回一个迭代器,迭代器中的元素是每个子串对应的匹配对象

result = finditer(r'\d{3}', 'ba203还是678说kk0222jksn就是23311')
print(result)
# print(next(result))
print(list(result))

<callable_iterator object at 0x0000023FCF210610>
[<re.Match object; span=(2, 5), match=‘203’>, <re.Match object; span=(7, 10), match=‘678’>, <re.Match object; span=(13, 16), match=‘022’>, <re.Match object; span=(23, 26), match=‘233’>]

6) split(正则表达式, 字符串) —— 将字符串中所有满足正则的子串作为切割点对字符串进行切割

str1 = '123aMKnb嗑生嗑死aKKssa923b==='
# 将str1中的a和b作为切割点对字符串进行切割
result = split(r'a|b', str1)
print(result)

[‘123’, ‘MKn’, ‘嗑生嗑死’, ‘KKss’, ‘923’, ‘===’]

7)sub(正则表达式, 字符串1, 字符串2) —— 将字符串2中所有满足正则的子串都替换成字符串1

result = sub(r'\d+', '*', 'ba203还是678说kk0222jksn就是23311')
print(result)

ba还是说kkjksn就是

8.2 匹配对象

result = search(r'(\d{3})([A-Z]{2})', '-=2设计师234KM222哈哈宿舍239KH')
print(result)

<re.Match object; span=(6, 11), match=‘234KM’>

1)直接获取整个正则表达式对应的匹配结果: 匹配对象.group()

print(result.group())       # '234KM'

2)手动捕获某个分组对应的匹配结果: 匹配对象.group(分组数)

print(result.group(1))      # '234'
print(result.group(2))      # 'KM'

3)获取匹配结果在原字符串中的位置: 匹配对象.span()

print(result.span())            # (6, 11)
print(result.span(2))           # (9, 11)

8.3 参数

1)匹配忽略大小写: (?i)

result = fullmatch(r'(?i)abc', 'AbC')
print(result)

<re.Match object; span=(0, 3), match=‘AbC’>

2)单行匹配: (?s)

  • 多行匹配(默认):匹配的时候.不能和换行(\n)进行匹配
  • 单行匹配:匹配的时候.可以和换行(\n)进行匹配
result = fullmatch(r'abc.123', 'abc\n123')
print(result)    result = fullmatch(r'(?s)abc.123', 'abc\n123')
print(result)

None
<re.Match object; span=(0, 7), match=‘abc\n123’>

Python Day16 正则表达式【初级】相关推荐

  1. Python中正则表达式用法 重点格式以这个为准_首看_各种问题

    20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...

  2. python使用正则表达式判别字符串是否以一个大写字符起始而跟随了一些小写字符

    python使用正则表达式判别字符串是否以一个大写字符起始而跟随了一些小写字符 # # Python3 code to find sequences of one upper # case lette ...

  3. python使用正则表达式统计字符串中出现次数最多的数字

    python使用正则表达式统计字符串中出现次数最多的数字 #python使用正则表达式统计字符串中出现次数最多的数字 # find the most occurring element import ...

  4. python使用正则表达式识别大写字母并在大写字母前插入空格

    python使用正则表达式识别大写字母并在大写字母前插入空格 #python使用正则表达式识别大写字母并在大写字母前插入空格 import redef putSpace(input):# regex ...

  5. python使用正则表达式删除字符串中的其它字符只保留数字和字母

    python使用正则表达式删除字符串中的其它字符只保留数字和字母 #python使用正则表达式删除字符串中的其它字符只保留数字和字母 # Python code to demonstrate # to ...

  6. python使用正则表达式寻找具有特定后缀的文件

    python使用正则表达式寻找具有特定后缀的文件 # python使用正则表达式寻找具有特定后缀的文件 # import library import re# list of different ty ...

  7. python使用正则表达式抽取字符串中最大数值数字

    python使用正则表达式抽取字符串中最大数值数字 #python使用正则表达式抽取字符串中最大数值数字 # Function to extract maximum numeric value fro ...

  8. python使用正则表达式去除句子中的重复词

    python使用正则表达式去除句子中的重复词 #python使用正则表达式去除句子中的重复词 # Python program to remove duplicate words # using Re ...

  9. python使用正则表达式检测给定的URL地址是否合法

    python使用正则表达式检测给定的URL地址是否合法 # python使用正则表达式检测给定的URL地址是否合法 # python使用正则表达式检测给定的URL地址是否合法 # Check if a ...

最新文章

  1. NeHe教程Qt实现——lesson12
  2. python处理大量excel数据-python往excel写入大量数据
  3. iOS 播放gif动态图的方式探讨
  4. 流行学习简单入门与理解
  5. 常用的字符串加密解密工具类
  6. 1154. 一年中的第几天 golang
  7. SqlBulkCopy类进行大数据(一万条以上)插入测试
  8. 适合新手学习的laravel接入微信接口,实现微信公众号二次开发
  9. 看完这些美食海报,你是不是又有灵感了?
  10. 二叉搜索树第k小元素
  11. [转载] java中接口(interface)详解
  12. 米家扫地机器人怎么加水_扫地机买什么 篇十:极速开箱! 米家扫地机1S 升级了啥?...
  13. python测验6_Python语言程序设计 - 测验6: 组合数据类型 (第6周)
  14. quartus中与modelsim进行联合仿真出现错误error:(vopt-13130)failed to find design unit****
  15. 新增用户时输入账号已存在(全局异常处理)
  16. 目标检测 YOLOv5 - 模型的样子
  17. PV操作与信号灯及例子
  18. python里float什么意思_Python中的float是什么意思,小白求答?
  19. IOS开发音频与视频
  20. k8s中的deployment

热门文章

  1. 抖音搜索的推荐下拉词置顶如何做
  2. 【转】解决由直接复制项目导致Tomcat无法启动(republish)的问题
  3. JS-鼠标光标指针悬停事件
  4. NYIST 2022年9月10日新生题解
  5. 华为服务器进无限重启,服务器不断异常重启
  6. 华为mate40价格曝光
  7. PyCharm社区版够用吗
  8. 已知两点经纬度,求两点直线距离-——python实现
  9. 华为云人工智能大赛·垃圾分类挑战杯
  10. 【11.9】Codeforces 刷题