python使用正则匹配判断字符串中含有某些特定子串及正则表达式详解

2024-03-01 0 926
目录
  • 一、判断字符串中是否含有字串
  • 二、正则表达式
    • (一)基本内容
      • 1.正则表达式修饰符——可选标志
      • 2.正则表达式模式
    • (二)常见表达式函数

    一、判断字符串中是否含有字串

    1. in,not in

    判断字符串中是否含有某些关键词,方法比较多例如分词后对词向量和关键词进行==匹配,但这种方法以来分词的准确性,不太推荐;其次使用成员运算符in,not in可以较好的判断字符串中是否包含某关键词,即特定字串

    a = \’这个暑假我读了红楼梦和三国演义\’
    b= [\’三国演义\’,\’水浒传\’,\’西游记\’,\’红楼梦\’]
    n = 0
    for i in b:
    if i in a:
    n += 1
    print(f\’四大名著暑假读了{n}本\’)

    这种遍历算法虽然可以成功得到想要的结果,但是当数据量很大的时候,程序执行效率将会很低。正则匹配作为专业的查找工具,在判断字符串中含有特定字串的事情上可以大大提高工作效率。

    2.正则匹配re.findall

    import re
    def is_in(fullstr,substr):
    if re.findall(substr,fullstr):
    return 1
    else:
    return 0
    a = \’这个暑假我读了红楼梦和三国演义\’
    b= [\’三国演义\’,\’水浒传\’,\’西游记\’,\’红楼梦\’]
    n = 0
    for i in b:
    n = is_in(a,i)
    n += 1
    print(f\’四大名著暑假读了{n}本\’)

    findall:返回string中所有与pattern匹配的全部字符串,返回形式为数组

    re.findall(pattern, string, flags=0)

    示例如下:

    line = []
    n = 0
    for i in b:
    num = is_in(a,i)
    n += num
    res = re.findall(i,a)
    line = line + res
    print(f\’四大名著暑假读了{n}本\’)
    print(f\’分别是{line}\’)
    \’\’\’
    res = re.findall(i,a) re.findall返回值是一个列表
    out:
    四大名著暑假读了2本
    分别是[\’三国演义\’, \’红楼梦\’]
    \’\’\’

    正则的功能十分强大,上述使用的只是其中一个很小的功能。下面继续对正则的强大功能进行学习

    二、正则表达式

    (一)基本内容

    1.正则表达式修饰符——可选标志

    正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志

    修饰符功能全称re.I匹配忽略大小写re.IGNORECASEre.L做本地化识别(locale-aware)匹配,即表示特殊字符集 \\w, \\W, \\b, \\B, \\s, \\S 依赖于当前环境(该标记官方已经不推荐使用)re.LOCALEre.M多行匹配,影响 ^ 和 $(正则表达式中^表示匹配行的开头,默认模式下它只能匹配字符串的开头;而在多行模式下,它还可以匹配 换行符\\n后面的字符。NOTE:正则语法中^匹配行开头、\\A匹配字符串开头,单行模式下它两效果一致,多行模式下\\A不能识别\\n)re.MULTILINEre.S使·. 匹配包括换行在内的所有字符(DOT表示.,ALL表示所有,连起来就是.匹配所有,包括换行符\\n。默认模式下.是不能匹配行符\\n的)re.DOTALLre.U表示特殊字符集 \\w, \\W, \\b, \\B, \\d, \\D, \\s, \\S 依赖于 Unicode 字符属性数据库(与 ASCII 模式类似,匹配unicode编码支持的字符,但是 Python 3 默认字符串已经是Unicode,所以有点冗余)re.UNICODEre.X增加可读性,忽略空格和 # 后面的注释 (默认模式下并不能识别正则表达式中的注释,而详细模式是可以识别的)re.VERBOSEre.A让 \\w, \\W, \\b, \\B, \\d, \\D, \\s 和 \\S 只匹配ASCII,而不是Unicodere.ASCIIre.DEBUG显示编译时的debug信息re.DEBUG

    2.正则表达式模式

    模式字符串使用特殊的语法来表示一个正则表达式:(1)字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。(2)多数字母和数字前加一个反斜杠时会拥有不同的含义,例如\\n 表示换行。(3)标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。(4)反斜杠本身需要使用反斜杠转义。(5)由于正则表达式通常都包含反斜杠,所以最好使用原始字符串来表示它们。模式元素(如 r'\\t',等价于 '\\\\t')匹配相应的特殊字符。

    下表列出了正则表达式模式语法中的特殊元素。如果使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

    模式功能示例匹配的字符串^匹配字符串的开头$匹配字符串的结尾.匹配任意字符,除了换行符\\n[…]表示一组字符单独列出[like]'l','i','k' 'e'[^…]表示不在[]中的字符[^like]除了'l','i','k' ,e之外的字符\\w匹配字母数字及下划线a-z、A-Z、0-9、_\\W匹配非字母数字及下划线\\s匹配任意空白字符,等价于 \\t \\n \\r \\f\\S匹配任意非空字符\\d匹配任意数字,等价于 [0-9]\\D匹配任意非数字\\A匹配字符串开始\\z匹配字符串结束\\Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串\\G匹配最后匹配完成的位置\\b匹配一个单词边界,也就是指单词和空格间的位置er\\bnever (√),verb(×)\\B匹配非单词边界er\\bnever (×),verb(√)\\n \\t等匹配一个换行符。匹配一个制表符。等\\1 …\\9匹配第n个分组的内容\\10匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式re*(* 贪婪)匹配0个或多个表达式(前一个字符出现0次或者⽆限次,即可有可⽆)abc*abcccre+(+懒惰)匹配1个或多个的表达式(前一个字符出现1次或者⽆限次,即⾄少有1次)abc+abc abccccre?(?占有)匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式(前一个字符出现1次或者0次,即要么有1次,要么没有)abc?abc abre{n}前一个字符出现n次o{2}food{m,n}匹配前⼀个字符出现从m到n次,若省略m,则匹配0到n次,若省略n,则匹配m到无限次ab{1,2}cabc abbca |b匹配a或b(re)对正则表达式分组并记住匹配的文本\\num引⽤分组num匹配到的字符串(?P<name>)分组起别名,匹配到的子串组在外部是通过定义的 name 来获取的(?P=name)引⽤别名为name分组匹配到的字符串

    (二)常见表达式函数

    正则表达式是一个特殊的字符序列,可以方便的检查一个字符串是否与某种模式匹配,python自带的re模块使 Python 语言拥有全部的正则表达式功能python常用的正则表达式函数如下:

    功能分类函数功能

    查找一个匹配项

    re.search

    查找任意位置的匹配项

    re.match

    必须从字符串开头匹配

    re.fullmatch

    整个字符串与正则完全匹配

    查找多个匹配项

    re.findall

    从字符串任意位置查找,返回一个列表

    re.finditer

    从字符串任意位置查找,返回一个迭代器

    分割

    re.split

    用正则表达式将某字符串分割成多段

    替换

    re.sub

    替换掉某字符串中被正则表达式匹配的字符,返回替换后的字符串,替换可以是字符串 也可以是 函数

    re.subn

    替换掉某字符串中被正则表达式匹配的字符,返回替换后的字符串 和 替换次数

    编译正则对象

    re.compile

    将正则表达式的样式编译为一个 正则表达式对象 (正则对象Pattern)

    re.template

    将正则表达式的样式编译为一个 正则表达式对象 ,并添加re.TEMPLATE模式

    其他

    re.escape

    可以转义正则表达式中具有特殊含义的字符,比如: . 或者 *

    re.purge

    清除正则表达式缓存

    1. re.match

    re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none

    re.match(pattern, string, flags=0)

    参数说明pattern匹配的正则表达式string要匹配的字符串flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。详见表1修饰符

    匹配成功 re.match 方法返回一个匹配的对象,否则返回 None可以使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式

    匹配对象方法描述group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号

    0:表示正则表达式中符合条件的字符串。1:表示正则表达式中符合条件的字符串中的第一个() 中的字符串。2:表示正则表达式中符合条件的字符串中的第二个() 中的字符串。以此类推…

    import re
    fullstr = \’name:alice,result:89\’
    result = re.match(\’name:(\\w+),result:(\\d+)\’, fullstr)
    print(result)
    print(result.group(0))
    print(result.group(1))
    print(result.group(2))
    print(result.group())

    结果:

    out1: <re.Match object; span=(0, 20), match=‘name:alice,result:89’>out2: name:alice,result:89out3: aliceout4: 89out5: name:alice,result:89

    从结果可以看出,re.match()方法返回一个匹配的对象,而不是匹配的内容。通过调用span()可以获得匹配结果的位置。而如果从起始位置开始没有匹配成功,即便其他部分包含需要匹配的内容,re.match()也会返回None可以使用group()来提取每组匹配到的字符串。group()会返回一个包含所有小组字符串的元组,从 0 到 所含的小组号

    注意:如果在运用正则表达式做匹配的过程中没有匹配到元素,之后又调用了group(),会报错:AttributeError: 'NoneType' object has no attribute 'group'如果出现这种报错,可以将match改成search()就可以避开这类问题了。search函数是先扫描全部的代码块,再进行提取的

    2.re.search

    re.search会匹配整个字符串,并返回第一个成功的匹配。如果匹配失败,则返回None

    re.search(pattern, string, flags=0)

    参数同re.match

    示例:

    import re
    fullstr = \’class:1班,name:alice,result:89\’
    result = re.match(\’name:(\\w+),result:(\\d+)\’, fullstr)
    print(result)
    print(result.group(0))

    out1: Noneout2: AttributeError: ‘NoneType’ object has no attribute ‘group’原因:match在起始位置匹配,如果不是起始位置匹配成功的话,match() 就返回 none

    尝试search

    import re
    fullstr = \’class:1班,name:alice,result:89\’
    result = re.search(\’name:(\\w+),result:(\\d+)\’, fullstr)
    print(result)
    print(result.group(0))
    print(result.group(1))
    print(result.group(2))
    print(result.group())

    out1: <re.Match object; span=(9, 29), match=‘name:alice,result:89’>out2: name:alice,result:89out3: aliceout4: 89out5: name:alice,result:89

    3. re.sub

    该函数主要用于替换字符串中的匹配项

    re.sub(pattern, repl, string, count=0, flags=0)

    示例如下:

    参数说明pattern必须参数:正则中的模式字符串repl必须参数:替换的字符串,也可为一个函数string必须参数,要被查找替换的原始字符串count可选参数,模式匹配后替换的最大次数,默认 0 表示替换所有的匹配flags可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0

    #修改分数
    fullstr = \’name:alice,result:89\’
    res1 = re.sub(r\’\\d+\’,\’90\’,fullstr)
    print(res1)

    out: name:alice,result:90

    repl可以为一个函数。如下:

    #修改分数
    def change(matched):
    value = int(matched.group(\’value\’))
    return str(value + 1)
    fullstr = \’name:alice,result:89\’
    res1 = re.sub(\'(?P<value>\\d+)\’,change,fullstr)
    print(res1)

    out: name:alice,result:90

    4.re.compile

    compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用re 模块的一般使用步骤是:

    1.使用 compile 函数将正则表达式的字符串形式编译为一个 Pattern 对象2.通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果(一个 Match 对象)3.最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作里是引用

    re.compile(pattern, flags)

    compile返回的是一个匹配对象,它单独使用就没有任何意义,需要和findall(), search(), match()搭配使用

    5.re.findall

    在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表注: match 和 search 是匹配一次 findall 匹配所有

    6.re.split

    re.split(pattern, string[, maxsplit=0, flags=0])

    到此这篇关于python使用正则匹配判断字符串中含有某些特定子串 及 正则表达式详解的文章就介绍到这了,更多相关python正则表达式判断字符串中是否含有字串内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

    您可能感兴趣的文章:

    • Python正则表达式匹配字符串中的数字
    • python 正则表达式获取字符串中所有的日期和时间
    • Python字符串和正则表达式中的反斜杠(\’\’\\\’\’)问题详解
    • Python 正则表达式匹配数字及字符串中的纯数字
    • python正则表达式从字符串中提取数字的思路详解
    • python正则表达式匹配不包含某几个字符的字符串方法
    • Python使用正则表达式分割字符串的实现方法
    • python字符串中匹配数字的正则表达式

    收藏 (0) 打赏

    感谢您的支持,我会继续努力的!

    打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
    点赞 (0)

    悠久资源 正则表达式 python使用正则匹配判断字符串中含有某些特定子串及正则表达式详解 https://www.u-9.cn/biancheng/zhengze/181193.html

    常见问题

    相关文章

    发表评论
    暂无评论
    官方客服团队

    为您解决烦忧 - 24小时在线 专业服务