正则表达式 -- 一文成为正则老司机

概述

本文是对《正则表达式必知必会的》的知识点梳理。本书总结了工程中常用的正则表达式用法,梳理出来便于日常查找和复习。

文中所有正则表达式示例用python3中的re包作为演示。

目录

1 匹配单个字符
2 匹配一组字符
3 使用元字符

1 匹配单个字符

本节主要讲单个字符通配符“.”和转义元字符“\”的使用。
元字符:有特殊含义的字符,而不是字符本身含义。

1.1 “.”的使用
>>> import re
>>> string = "hello world!"
>>> re.findall(".ll.", string)
['ello']

如上,“.”匹配上了"ll"左边的“e”和右边的“o”。

group(0)可以得到匹配上的字符串,相应的还有group(1),group(2),… 将在后面介绍。

如果需要匹配“.”本身,则需要转义字符“\”来将“.”的特殊含义转义到"."本身。例子如下:

>>> string = "There are some serects in serect.txt."
>>> re.findall("serect.", string)
['serects', 'serect.']

>>> re.findall("serect\.", string)
['serect.']

如上,当不对“.”进行转义时,匹配到了’serects’和’serect.’,因为“.”可以匹配任意字符;当转义之后,只匹配上了’serect.’,此时的“.”只能匹配“.”本身了。

2 匹配一组字符

本节学习学习如何和字符集合打交道。

2.1 匹配多个字符中的某一个

假如我们需要从一段字符串中找出“cat.txt”,其中“cat”的任意字符可能是大写。

>>> string = "12ad cat.txt cAt.txt, CAt.txt"
>>> re.findall("[cC][aA][tT]\.txt", string)
['cat.txt', 'cAt.txt', 'CAt.txt']

其中“[”和“]”不匹配任何字符,只负责定义一个字符集合,可以匹配字符集合中任意一个元素。

2.2 利用字符集合区间

在2.1例子的基础上,假如cat后面有一个数字,如“cat1.txt”,我们需要找出所有这些文件名。

>>> string = "12ad cat1.txt cAt5.txt, CAt8.txt"
>>> re.findall("[cC][aA][tT][0123456789]\.txt", string)
['cat1.txt', 'cAt5.txt', 'CAt8.txt']
>>> re.findall("[cC][aA][tT][0-9]\.txt", string)
['cat1.txt', 'cAt5.txt', 'CAt8.txt']

如上所示,“-”表示字符区间,[0-9]等价于[0123456789]。
常用的字符区间还有:

  • A-Z
  • a-z
  • A-z,这个区间不常用,因为Z和a之间还包含“[”和“^”等ASCII表中的字符。

字符集合区间非常有用,比如笔者就经常用字符区间来从一段文本中匹配中文,如下所示:

>>> text = "asdd13我sfg12爱n 中98kiajh国-2"
>>> re.findall("[\u4e00-\u9fa5]+", text)
['我', '爱', '中', '国']

其中“\u4e00“,”\u9fa5”分别是中文的utf-8编码的开始和结束编码。“+”表示至少匹配一个字符,后面会讲到。

注意:“-”字符在[和]之间时表示区间,而在集合之外的地方,“-”只是一个普通字符,与“-”匹配时不需转义。

2.3 取非匹配

在2.2例子的基础上,假如我们需要匹配cat加数字的文件,如“cat1.txt”,而不能匹配cat加字母的文件,如“catp.txt”文件。

>>> string = "12ad cat1.txt catp.txt cAt5.txt, CAt8.txt CAto.txt"
>>> re.findall("[cC][aA][tT][^a-zA-Z]\.txt", string)
['cat1.txt', 'cAt5.txt', 'CAt8.txt']

说明:"^"为取非匹配,用来排除字符集合中所有字符。上面例子中则是:除了a-z和A-Z中的所有字符都可以匹配。

3 使用元字符

前文提到过,元字符就是有着特殊含义饿的字符。如“.”可以用来匹配任何一个单个字符;“[”标志这一个字符集合的开始。当需要匹配元字符的字符时,需要用“\”进行转义。

本节将介绍更多有用的元字符。

3.1 匹配空白字符
元字符说明
\f换页符
\n换行符
\r回车符
\t制表符
\v垂直制表符
\s任何一个空白字符(等价于[\f\n\r\t\v])
\S任何一个非空白字符(等价于[^\f\n\r\t\v])

注意:

  1. \r\n匹配一个“回车+换行”组合,许多操作系统(比如windows)把这个组合作为文本行的结束标签。
  2. .和[是元字符,但前提是你没有对它们进行转义;f和n也是元字符,但前提是你对它们进行了转义。
3.2 匹配特定的字符类别
  1. 匹配数字
元字符说明
\d任何一个数字字符(等价于[0-9])
\D任何一个非数字字符(等价于[^0-9])
  1. 匹配字母和数字
元字符说明
\w任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-ZA-Z0-9_])
\W任何一个非字母数字字符或非下划线字符(等价于[^a-ZA-Z0-9_])

说明:因为字母数字和下划线常用于各种文件名、目录名、变量名等。

4 重复匹配

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值