博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在python中使用正则表达式(一)
阅读量:4313 次
发布时间:2019-06-06

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

在python中通过内置的re库来使用正则表达式,它提供了所有正则表达式的功能。

一.写在前面:关于转义的问题

正则表达式中用“\”表示转义,而python中也用“\”表示转义,当遇到特殊字符需要转义时,你要花费心思到底需要几个“\”,所以为了避免这个情况,墙裂推荐使用原生字符串类型(raw string)来书写正则表达式。

方法很简单,只需要在表达式前面加个“r”即可,如下

r'\d{2}-\d{8}'
r'\bt\w*\b'

二.Re库常用的功能函数

 

1.   re.match()

从字符串的起始位置匹配,匹配成功,返回一个匹配的对象,否则返回None

语法:re.match(pattern, string, flags=0) pattern:匹配的正则表达式 string:要匹配的字符串 flags:标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等;flags=0表示不进行特殊指定

可选标志如下:

修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志

 示例:

不含标志位:>>> re.match(r'\d{2}','123')<_sre.SRE_Match object; span=(0, 2), match='12'>>>> re.match(r'\d{2}','ab123')>>> print(re.match(r'\d{2}','ab123'))None含有标志位:>>> re.match(r'a','ab123').group()'a'>>> re.match(r'a','Ab123').group()Traceback (most recent call last):File "
", line 1, in
re.match(r'a','Ab123').group()AttributeError: 'NoneType' object has no attribute 'group'>>> re.match(r'a','Ab123',re.I).group()'A'

2.  re.search()

扫描整个字符串并返回第一个成功的匹配对象,否则返回None

语法:re.search(pattern, string, flags=0)

示例:

>>> re.search(r'\d{2}','Ab123')<_sre.SRE_Match object; span=(2, 4), match='12'>>>> re.search(r'\d{2}','Abcde')>>> print(re.search(r'\d{2}','Abcde'))None

可以看到match()和search()返回的时match对象(即匹配对象),可以通过group()方法获得匹配内容

>>> re.search(r'\d{2}','Ab12c34d56e78').group()'12'>>> re.match(r'\d{2}','12c34d56e78').group(0)'12' group() 同group(0)就是匹配正则表达式整体结果,也就是所有匹配到的字符

group()其实更多的结合分组来使用,即如果在正则表达式中定义了分组(什么是分组?参见正则表达式学习,一个左括号“(”,表示一个分组),就可以在match对象上用group()方法提取出子串来。后面会单独写一下group()和groups()的用法,这里先简单了解一下。

re.match与re.search的区别:

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配(注意:仅仅是第一个)


 3.  re.findall()

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表

注意: match 和 search 是匹配一次,而findall 匹配所有

>>> re.findall(r'\d{2}','21c34d56e78')['21', '34', '56', '78']

4.  re.finditer()

和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回.

示例:

>>> match = re.finditer(r'\d{2}','21c34d56e78')>>> for t in match:    print(t.group())    21345678>>>

5.  re.split()

根据正则表达式中的分隔符把字符分割为一个列表并返回成功匹配的列表.

示例:

>>> match = re.split(r'\.|-','hello-world.data')   # 使用 . 或 - 作为字符串的分隔符>>> print(match)['hello', 'world', 'data']

字符串也有split方法,如下,作个对比:

字符串的split方法>>> 'a b   c'.split(' ')  # b和c之间有3个空格['a', 'b', '', '', 'c'] 如果用空格不好理解的话,可以换位x>>> 'axbxxxc'.split('x')['a', 'b', '', '', 'c']>>>

可以看到,单纯用字符串的split方法无法识别连续的空格,

用正则表示式如下:

>>> re.split(r'\s+', 'a b   c')  # \s+ 表示匹配一个或多个空白符(\s表示匹配空白符,+表示重复1次或1次以上)['a', 'b', 'c']>>>

6. re.sub()

用于替换字符串中的匹配项

语法: re.sub(pattern, repl, string, count=0)
  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

示例:

>>> match = re.sub(r'a', 'b','aaccaa')   # 把字符串中的a都替换为b>>> print(match)bbccbb>>>

参考:https://www.cnblogs.com/yan-lei/p/7653362.html和菜鸟教程

 

转载于:https://www.cnblogs.com/hanmk/p/9143514.html

你可能感兴趣的文章
在LAMP的生产环境内添加PHP的cURL扩展模块
查看>>
AMH 软件目录介绍
查看>>
你可能使用了Spring最不推荐的注解方式
查看>>
java常见3种文件上传速度对比和文件上传方法详细代码
查看>>
SVD总结
查看>>
python基础教程(三)
查看>>
PL SQL Developer中文乱码
查看>>
字符串知识大全
查看>>
软件目录结构规范及堂兄弟文件引用
查看>>
H5 WebSocket通信和WCF支持WebSocket通信
查看>>
文件上传
查看>>
不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况...
查看>>
Linux的IO性能监控工具iostat详解
查看>>
老杨聊架构:每个架构师都应该研究下康威定律
查看>>
1022: 锤子剪刀布
查看>>
RESTful-rest_framework认证组件、权限组件、频率组件-第五篇
查看>>
手机自带功能调用
查看>>
百度搜索引擎取真实地址-python代码
查看>>
java 多线程 Future callable
查看>>
字符串操作练习:星座、凯撒密码、99乘法表
查看>>