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

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

正则表达式

推荐一本书:《Sams Teach Yourself Regular Expressions in 10 Minutes》。

下面列举常用的regex元字符。

元字符 作用
. 任意字符匹配
\ 转义特殊字符
[ ] 使用[和]来包含一个字符集合,代表和其中任意一个成员匹配的文本
\w 字母、数字
\d 数字
( ) 常常用于子表达式的构建
\E 结束\L或\U的转换
\U 将\U和\E之间的字符全部转换成大写字符
\L 将\L和\E之间的字符全部转换成小写字符
\u 将\u后面的字符或者子集变成大写字符
\l 将\l后面的字符或者子集变成小写字符
[\b] 回退删除 backspace
\f 换页
\n 换行
\r 回车
\t 制表符 tab
\v 垂直制表符
\s 空白符
\b 匹配着这样的位置:位于一个能构成单词的字符(字母,数字,下划线。\w)和不能构成单词的字符(\W)之间对于cat scatter文本,\bcat\b仅仅匹配第一个单词cat
* 匹配0个或者多个
+ 匹配至少一个
{n,m} 匹配n到m个

贪婪型元字符 懒惰型元字符
* *?
+ +?
{n,} {n,}?

书中提到的正则表达式测试器,可下载:
是一个很棒的用于练习正则表达式的文本工具。

正则表达式在python中的应用

正则表达式模式匹配

正则表达式模块re是python自带的。

基本步骤:

  • 导入re库
  • 创建Regex对象
  • 搜索并返回match对象
  • 返回匹配的字符串
  • >>> import re>>> regex = re.compile(r"\d{3}-\d{3}-\d{4}")>>> match = regex.search('231-345-8972')>>> print(match.group())231-345-8972

    正则分组

    通过group返回正则分组

    >>> import re>>> regEx = re.compile(r'(\d{3})-(\d{3})-(\d{4})')>>> mo = regEx.search('231-345-8972')>>> mo.group(1)'231'>>> mo.group(2)'345'>>> mo.group(3)'8972'>>> mo.group(0)'231-345-8972'>>>

    返回所有的分组

    >>> mo.groups()('231', '345', '8972')

    正则表达式的贪心和非贪心

    ?在正则表达式中可以表示可选,也能表示非贪心匹配。

    #! /usr/bin/pythonimport rebatRegex = re.compile(r'(Ha){3,5}')mo = batRegex.search('HaHaHaHaHa')print(mo.group())batRegex = re.compile(r'(Ha){3,5}?')mo = batRegex.search('HaHaHaHaHa')print(mo.group())

    执行:

    [edemon@CentOS workspace]$ ./regex.py HaHaHaHaHaHaHaHa

    regex对象的search和findall

    search方法在找到第一个匹配的内容后即停止了工作,但是findall会返回所有的字符串,以list的形式供我们处理。

    #! /usr/bin/pythonimport retext = '''231-345-8972213-324-5476'''print("origin text is:\n"+text)regex = re.compile(r'\d{3}-\d{3}-\d{4}')mo = regex.search(text)print("search result is:" + str(mo.group()))rlist = regex.findall(text)print("findall result is:" + str(rlist))

    运行效果:

    [edemon@CentOS workspace]$ ./regex.py origin text is:231-345-8972213-324-5476search result is:231-345-8972findall result is:['231-345-8972', '213-324-5476']

    常用字符分类缩写

    分类字符 表示
    \d 0-9的任何数字
    \D 除0-9的数字以外的字符
    \w 字母、数字、下划线字符
    \W 除字母、数字、下划线以外的任何字符
    \s 空白字符(空格、制表符、换行符)
    \S 除空白字符以外的字符

    匹配换行

    如果使得re.DOTALL作为re.compile()第二个参数,那么.将匹配所有的字符,包括换行。

    re.DOTALL

    Make the ‘.’ special character match any character at all, including a newline; without this flag, ‘.’ will match anything except a newline.

    不区分大小写的匹配

    给re.compile()传入第二个参数re.IGNORECASE或re.I则不理会字母的大小写。

    如下:

    import retext = 'Hello World'mo = re.compile('hello world',re.I)print(mo.search(text).group())# Hello World

    VERBOSE

    compile的flag: re.VERBOSE可使得正则表达式中的注释、多余空白字符都被忽略。这样增强了阅读性。


    更多的应用技巧,需要靠实践掌握了。

转载地址:http://gepli.baihongyu.com/

你可能感兴趣的文章
构建OpenStack的云基础架构:ManageIQ(转)
查看>>
CentOS 7.0,启用iptables防火墙(转)
查看>>
实战DDD(Domain-Driven Design领域驱动设计:Evans DDD)
查看>>
SSH中各个框架的作用以及Spring AOP,IOC,DI详解
查看>>
openstack juno 配置vmware(vcenter、vsphere)
查看>>
远程debug调试(eclipse)之openstack windows
查看>>
PAAS平台对比:OpenShift VS CloudFoundry【51CTO调研报告】
查看>>
JAX-RS(java restful实现讲解)(转)
查看>>
Spring MVC与JAX-RS比较与分析
查看>>
openstack官方docker介绍
查看>>
[转]在ASP.NET 2.0中操作数据::创建一个数据访问层
查看>>
Linux命令之chmod详解
查看>>
【java小程序实战】小程序注销功能实现
查看>>
Java中子类能否继承父类的私有属性和方法
查看>>
JVM内存模型详解
查看>>
(六) Git--标签管理
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
Linux-网络运维基础
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>