概述
本文是对《正则表达式必知必会的》的知识点梳理。本书总结了工程中常用的正则表达式用法,梳理出来便于日常查找和复习。
文中所有正则表达式示例用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]) |
注意:
- \r\n匹配一个“回车+换行”组合,许多操作系统(比如windows)把这个组合作为文本行的结束标签。
- .和[是元字符,但前提是你没有对它们进行转义;f和n也是元字符,但前提是你对它们进行了转义。
3.2 匹配特定的字符类别
- 匹配数字
元字符 | 说明 |
---|---|
\d | 任何一个数字字符(等价于[0-9]) |
\D | 任何一个非数字字符(等价于[^0-9]) |
- 匹配字母和数字
元字符 | 说明 |
---|---|
\w | 任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-ZA-Z0-9_]) |
\W | 任何一个非字母数字字符或非下划线字符(等价于[^a-ZA-Z0-9_]) |
说明:因为字母数字和下划线常用于各种文件名、目录名、变量名等。
4 重复匹配
未完待续。。。