博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python:正则表达式
阅读量:6253 次
发布时间:2019-06-22

本文共 2824 字,大约阅读时间需要 9 分钟。

python正则表达式功能模块:re

matchObj = re.match(r'(\d+)([abcd]+)', '12bbcxyz')  #[abcd]表示:a或b或c或dif matchObj:    print matchObj.groups() #('12', 'bbc')    print matchObj.group()  #12bbc    print matchObj.group(1) #12    print matchObj.group(2) #bbc#    print matchObj.group(3) #报错IndexError: no such groupelse:    print 'None match'

re.match()方法:

参数1是正则表达式匹配模式,参数2是待匹配的原始字符串;

此方法只从字符串的开头匹配,若开头不匹配即使字符串中间有子串能匹配也返回None。如参数2换为'a12bbcxyz'则输出None match

re.search()方法:

match方法参数一样,不过可以匹配字符串里面的子串,如参数2换为'a12bbcxyz'则输出不变。

matchsearch两个方法只能找到匹配参数1匹配模式的,从参数2原始字符串左起的第一个字符串。若想找到所有的匹配的字符串,用下面介绍的findall方法。

若匹配成功则返回一个匹配对象:matchObj:

其有group(num=0)groups()方法:

group(n)(n=1、2、3…)会返回同第n分组匹配的字符串(参数1匹配模式里的每个括号里是一个分组);
group()方法有默认参数0group(0)会返回同整个参数1模式匹配的字符串(这个非分组);
groups()方法返回所有分组组成的元组(若无分组返回空元组),第一个分组的组号为1。


findall方法:

findres = re.findall(r'\d[a-z]', '1one2two')print findres  #['1o', '2t']findres = re.findall(r'(\d)[a-z]', '1one2two')print findres  #['1', '2']findres = re.findall(r'(\d)([a-z])', '1one2two')print findres  #[('1', 'o'), ('2', 't')]

若参数1匹配模式无分组:则返回所有同整个匹配模式匹配的字符串组成的列表;

若参数1有分组:若只有1个分组,则返回所有同分组匹配的字符串组成的列表;若分组数大于1,则返回所有同各分组匹配的字符串组成的元组的列表。

加入匹配标志位flags

pattern = re.compile('(.*)', re.M)div_list = re.findall(pattern, page)print(div_list)

正则替换:sub方法

普通字符串替换:

print 'ABC'.replace('A' , 'a') #aBC

正则替换:

print re.sub(r'\d', '*', '123bbc', count=2)   # **3bbc  count=2表示进行2次替换print re.sub(r'\d+', '*', '123bbc', count=2)  # *bbc    此处只进行了1次替换print re.sub(r'\d+?', '*', '123bbc', count=2) # **3bbc  加?表示非贪婪模式:最小范围匹配。进行了2次替换。

count参数指定从左边起替换几次,默认为0,表示全部替换;

此种情况下参数1匹配模式分组信息无效,只会对匹配整个模式的字符串进行替换。

另外sub方法的第二个参数除了可以是字符串外,还可以是替换函数:

替换函数接受的参数是匹配对象;
返回值是匹配整个模式的字符串将要被替换为的内容;
count参数决定替换函数执行的次数。

import redef rep_f(matchObj):    print matchObj.group()    print matchObj.groups()    return matchObj.group('group_b') #使用(?P
...)给分组2指定了一个别名group_b,group函数可以接受别名参数,此处相当于group(2) print re.sub(r'(\d+)(?P
b)', rep_f, '123bb234c123bbc123bbc', count=2)# 输出:# 123b# ('123', 'b')# 123b# ('123', 'b')# bb234cbbc123bbc

字符串分割:

import reprint re.split(r'\d+(b)', '123bb234c123bbc123bbc', 2)# ['', 'b', 'b234c', 'b', 'bc123bbc']

与参数1匹配模式中的分组匹配的字符串,会在分割后的返回值列表中出现;

参数3指定最大分割次数,也就是最多用几个能完整匹配参数1匹配模式的字符串分割。


各个方法的原型:

re.match(pattern, string, flags=0)              #返回值:匹配对象re.search(pattern, string, flags=0)             #返回值:匹配对象re.findall(pattern, string, flags=0)            #返回值:listre.sub(pattern, repl, string, count=0, flags=0) #返回值:str, replre.split(pattern, string, maxsplit=0, flags=0) #返回值:list

其中flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。具体的:如re.I | re.M 被设置成 IM标志。

修饰符 描述
re.I 使匹配对大小写不敏感
re.L 做本地化识别(locale-aware)匹配
re.M 多行匹配,影响 ^ 和 $
re.S 使 . 匹配包括换行在内的所有字符
re.U 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

在这里插入图片描述

转载于:https://www.cnblogs.com/xuejianbest/p/10285137.html

你可能感兴趣的文章
做了几道简单的基础题,慢慢熟悉循环
查看>>
元素的多种延时等待(&页面的超时处理)
查看>>
ios 后台发送邮件之SKPSMTPMessage的使用
查看>>
JavaScript学习
查看>>
3014C语言_运算符
查看>>
202702算法_二分法查找
查看>>
Win10 UWP开发实现Bing翻译
查看>>
各种不同类型的类
查看>>
mvc4 -@Html.Partial,@Html.RenderPartial
查看>>
windows2012 r2 提高网速方法
查看>>
调试R代码中出现的常用的函数
查看>>
JavaWeb 之 AJAX
查看>>
十、spark graphx的scala示例
查看>>
探秘SpringAop(一)_介绍以及使用详解
查看>>
查询指定时间内审核失败的事件日志
查看>>
problem-solving-with-algorithms-and-data-structure-usingpython(使用python解决算法和数据结构) -- 算法分析...
查看>>
springmvc流程
查看>>
BAT涉足汽车产业后对汽车后市场的影响是什么?
查看>>
LeetCode:Remove Nth Node From End of List
查看>>
删除链表的第 n 个结点
查看>>