当前位置:

python 正则表达式相关知识

访客 2024-01-09 1193 0

1、compile函数

使用re.compile可以将正则表达式的字符串形式编译为一个Pattern对象,通过Pattern对象提供的一系列方法对文本进行匹配查找,re.compile单独使用没有任何意义,需要和findall(),search(),match()等搭配使用。比如:

  • importre
  • text='''
  • 【代号】华法琳
  • 【性别】女
  • 【战斗经验】十年
  • 【出身地】卡兹戴尔
  • '''
  • p=re.compile(r'【.*?】')#使用re.compile编写要匹配的规则
  • p.findall(text)#找出所有【】的内容
  • #匹配结果为:['【代号】','【性别】','【战斗经验】','【出身地】']
  • 2、findall函数

    findall()可以返回文本中所有与Pattern匹配的字符,返回形式为数组

    findall可以有两种方式使用:

    re.findall(pattern,text)#pattern为re.compile编写的pattern对象,text为要进行匹配的文本

    pattern.findall(text)#text为要进行匹配的文本

    当匹配不到文本时返回空列表。

  • importre
  • text='''新增关卡:GA-ST-1风云际会、GA-1灯下黑、GA-2散步时光、
  • GA-3混血儿、GA-TR-1甜品时间、
  • GA-4安魂教堂、GA-5葬礼、GA-6安魂曲、GA-7光与影、GA-8影与灰、GA-ST-2鸢尾花'''
  • p=re.compile(r'(GA-.*?)、')#匹配GA-开始、顿号结束的字符
  • p.findall(text)#找出所有符合的字符文本
  • #输出结果为:
  • ['GA-ST-1风云际会',
  • 'GA-1灯下黑',
  • 'GA-2散步时光',
  • 'GA-3混血儿',
  • 'GA-TR-1甜品时间',
  • 'GA-4安魂教堂',
  • 'GA-5葬礼',
  • 'GA-6安魂曲',
  • 'GA-7光与影',
  • 'GA-8影与灰']
  • 3、match函数search函数

    match()个人觉得比较废,我基本不会用,他的概念是从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None。(如果开头第一个字符匹配不到,那直接就返回None了。。)

    search()与match()类似,唯一的区别就是search可以不从位置0开始匹配

    re.match和re.search匹配成功之后,都是返回一个Object对象,提供了以下的方法:

    • group()返回匹配的字符串
    • start()返回匹配开始的位置
    • end()返回匹配结束的位置
    • span()返回一个元组,包含匹配(开始,结束)的位置
  • importre
  • #使用match来进行匹配
  • result=re.match("华法琳","华法琳小姐的道德观念相当淡泊。")
  • #因为匹配的文本以"华法琳"开头,match可以匹配到,并返回一个对象
  • ifresult:
  • print(result.group())
  • else:
  • print("匹配失败!")
  • #运行结果:华法琳
  • #使用match来进行匹配
  • result=re.match("华法琳","每个人都知道华法琳小姐是罗德岛的元老且医术高超。")
  • #因为匹配的文本没有以"华法琳"开头,match直接返回None
  • ifresult:
  • print(result.group())
  • else:
  • print("匹配失败!")
  • #运行结果:匹配失败!
  • importre
  • #使用search进行匹配
  • p=re.compile(r'血先生')
  • text='华法琳小姐的房间中摆放的那些“血先生”参与过的著作,“血先生”正是华法琳小姐。'
  • #和match不同,即使不以"血先生"开头,search也可以匹配到文本
  • #同时与findall不同,search只能匹配到一个"血先生"
  • result=re.search(p,text)
  • ifresult:
  • print(result.group())
  • else:
  • print("匹配失败!")
  • #输出结果为:血先生
  • 4、sub函数

    re.sub()用于替换文本中需要替换掉的词语,返回替换后的文本,sub有两种使用方式:

    pattern.sub(替代后的词语,text)

    re.sub(pattern,替代后的词语,text)

  • text='''虽然,从外表上看阿米娅仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。
  • 现在,阿米娅正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。'''
  • p=re.compile(r'阿米娅')
  • result=p.sub('胡桃',text)
  • #等价于result=re.sub(p,'胡桃',text)
  • print(result)
  • #结果:'虽然,从外表上看胡桃仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。\n
  • #现在,胡桃正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。'
  • 5、split函数

    split能够按照所能匹配的字串将字符串进行切分,返回切分后的字符串列表,split也是有两种使用方式:

    pattern.split(text)

    re.split(pattern,text)

  • importre
  • text='''虽然,从外表上看阿米娅仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。
  • 现在,阿米娅正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。'''
  • p=re.compile(r'阿米娅')
  • p.split(text)
  • #等价于:re.split(p,text)
  • #输出:
  • #['虽然,从外表上看',
  • #'仅仅是个不成熟的少女,实际上,她却是深受大家信任的合格的领袖。\n现在,',
  • #'正带领着罗德岛,为了感染者的未来,为了让这片大地挣脱矿石病的阴霾而不懈努力。']
  • 表达式字符含义:

    与多种字符匹配的表达式


    /d任意一个数字,0~9之中的任意一个数字,/D匹配所有非数字字符

    /w任意一个字母或数字或下划线,也可以是中文,/W匹配所有非数字字符下划线的字符

    /s包括空格、制表符、换页符等空白字符的其中任意一个,/S匹配所有非空白字符

    .小数点可以匹配除了换行符(/n)以外的任意一个字符


    匹配多种字符的表达式


    [aA1@]匹配"a"或"A"或"1"或"@"

    [^abc]匹配"a","b","c"之外的任意一个字符

    [f-k]匹配"f"~"k"之间的任意一个字母

    [^A-C0-3]匹配"A"~"C","0"~"3"之外的任意一个字符


    修饰匹配次数的符号


    {n}表达式重复n次,比如:"/w{2}"相当于"/w/w";"a{5}"相当于"aaaaa"

    {x,y}表达式至少重复m次,最多重复n次,比如:"ab{1,3}"可以匹配"ab"或"abb"或"abbb"

    {m,}表达式至少重复m次,比如:"/w/d{2,}"可以匹配"a12","_456","M12344"...

    ?匹配表达式0次或者1次,相当于{0,1}

    ''表达式至少出现1次,相当于{1,}.

    *表达式不出现或出现任意次,相当于{0,}


    特殊符号


    ^与字符串开始的地方匹配,不匹配任何字符

    $与字符串结束的地方匹配,不匹配任何字符

    /b匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符,/B匹配非单词边界

    |表示"或"关系,a|b表示a或者b

    ()在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    其他:

    在线正则表达式测试网站:https://regex101.com/

    匹配中文:re.compile(r"[\u4e00-\u9fa5]")

    发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~