有些人在碰到问题时,就想:“我知道,我可以使用正则表达式。“现在,他们就有了两个问题。
-----------Jamie ”Jwz“ Zawinski
一、概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
二、简介
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。
三、特殊符号与字符
表示法 | 描述 | 正则表达式示例 |
literal | 匹配文本字符串的字面值literal | foo |
re1|re2 | 匹配正则表达式re1或者re2 | foo|bar |
. | 匹配任何字符(除了\n之外) | b.b |
^ | 匹配字符串其实部分 | ^Dear |
$ | 匹配字符串终止部分 | bin\*sh$ |
* | 匹配0次或者多次前面出现的正则表达式 | [A-Za-z0-9]]* |
+ | 匹配1次或者多次前面出现的正则表达式 | [a-z]+\.com |
? | 匹配0次或者1次前面出现的正则表达式 | goo? |
{N} | 匹配N次前面出现的正则表达式 | [0-9]{3} |
{M,N} | 匹配M-N前面出现的正则表达式 | [0-9]{5,0} |
[...] | 匹配来自字符集的任意单一字符 | [aeiou] |
[..x-y..] | 匹配x-y范围中的任意单一字符 | [0-9],[A-Za-z] |
[^..] | 不匹配字此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) | [^aeiou],[^A-Za-z] |
(*|+|?|{})? | 用于匹配上面频繁出现/重复出现富豪的非贪婪版本(*、+、?、{}) | .*?[a-z] |
(...) | 匹配封闭的正则表达式,人后另存为子组 | ([0-9]{3})?,f(oo|u)bar |
四、Python re模块函数
Python中的re模块提供了对正则表达式的支持。
1、匹配和搜索
在Python术语中,主要有两种方法完成模式匹配:”搜索"(searching),即在字符串任意部分中搜索匹配的模式;而“匹配”(matching)是指判断一个字符串能否从起始处全部或者部分地匹配某个模式。搜索通过search()函数或方法实现,而匹配通过调用match()函数或方法实现。
re.match()函数用于在字符串中匹配正则表达式,如果匹配成功,则返回MatchObject对像实例。re.search()函数用于在字符串中查找正则表达式,如果找到,则返回MatchObject对象实例。re.findall()函数用于在字符串中查找所有符合正则表达式得字符串,并返回这些字符串得列表。如果在正则表达式中使用了组,则返回一个元组。
re.match()函数和re.search()函数的作用基本一样。不同的是,re.match()函数只从字符串中的第一个字符开始匹配。而re.search()函数则搜索整个字符串。
re.match(pattern, string[, flags]) re.search(pattern, string[, flags]) re.findall(pattern, string[, flags])
参数含义:
- pattern:匹配模式
- string:要进行匹配的字符串
- flags:可选参数,进行匹配的标志
- 参数flags可以是以下选项:
- re.I:忽略大小写
- re.L:根据本地设置而更改\w,\W,\b,\B,\s,\S的匹配内容
- re.M:多行匹配模式
- re.S:使“.” 元字符匹配换行符
- re.U:匹配Unicode字符
- re.X:忽略pattern中的空格,并且可以使用“#”注释
- 以上几个编译标志可以同时使用。同时使用时需要使用“|”对并用的编译标志进行运算。
2、替换函数
re.sub()函数用于替换字符串中符合正则表达式的内容,它返回替换后的字符串。re.subn()函数与re.sub()函数相同,只不过re.subn()函数返回一个元组。
re.sub(pattern, repl, string[, count]) re.subn(pattern, repl, string[, count])
参数含义:
- pattern:正则表达式模式
- repl:要替换成的内容
- string:进行内容替换的字符串
- count:可选参数,最大替换次数
3、分割字符串函数
re.split()函数用于分割字符串,它返回分割后的字符串列表。
re.split(pattern, string[, maxsplit=0])
参数含义:
- pattern:正则表达式模式
- string:要分割的字符串
- maxsplit:可选参数,最大分割次数
五、正则表达式对象
1、使用re.compile()函数将正则表达式编译生成正则表达式对象实例后,可以使用正则表达式对象实例提供的属性和方法对字符串进行处理。
特殊字符 | ||
\d | 匹配任何十进制数字,与[0-9]一致,\D与\d相反,不匹配任何非数值型的数字 | data\d+.txt |
\w | 匹配任何字母数字字符,与[A-Za-z0-9]相同(\W与之相反) | [A-Za-z]\w+ |
\s | 匹配任何空格字符,与[\n\f\r\v\t]相同,\S与之相反 | of\sThe |
\b | 匹配任何单词边界(\B与之相法) | \bThe\b |
\N | 匹配已保存的子组 | price:\16 |
\c | 逐字匹配任何特殊字符c | .\,\\,\* |
\A | 匹配字符串的起始 | \ADear |
2、编译正则表达式
re模块中包含一个re.compile()函数,可以使用re.compile()函数将正则表达式编译生成一个RegexObject对象实例。然后通过生成的RegexObject对象实例对字符串进行操作,如查找,替换等。
3、使用原始字符串
使用原始字符串,提高正则表达式的可读性,减少“\“在正则表达式中出现的次数。
由于在正则表达式中也要使用"\”开头的字符以表示某些特殊的含义,而在字符串中,转义字符也是以“\"开头,这就导致了冲突。例如在正则表达式中,”b\“表示匹配一个单词的开始或者结束,而在字符串中,”\b"则表示退格。如果在正则表达式中使用“\b",则应该写成”\\b"。
在re.compile()中使用“\b"的写法如下:
re.compile('\\ba.?') 使用原始字符串,写法如下 re.compile(r'\ba.?')
六、正则表达式对象的属性和方法
正则表达式对象提供了与re模块中函数类似的字符串操作方法。常用的正则表达式对象的属性和方法可以分为以下几种。
1、匹配和搜索
正则表达式对象的match()方法用于从字符串开始处进行匹配,或者从指定位置处进行匹配,要匹配的字符串必须位于开始,或者参数指定的位置才会匹配成功。
match(string[, pos[, end]])
参数含义:
- string:要进行匹配的字符串
- pos:可选参数,进行匹配的起始位置
- end:可选参数,进行匹配的结束位置
如果匹配成功,match()返回一个MatchObject对象实例。与match()类似,search()方法用于对字符串进行查找,不同的是search()方法在整个字符串中搜索,如果查找成功,search()将返回一个MatchObject对象实例。
search(string[, pos[, end]])
参数含义:
- string:要进行匹配的字符串
- pos:可选参数,进行查找的起始位置
- end:可选参数,进行查找的结束位置
正则表达式对象的findall()方法用于在字符串中查找所有符合正则表达的字符串,并返回这些字符串的列表。如果在正则表达式中使用了组,则返回一个元组。
findall(string[, pos[, end]])
参数含义:
- string:要进行匹配的字符串
- pos:可选参数,进行查找的起始位置
- end:可选参数,进行查找的结束位置
2、替换
正则表达式对象的sub()和subn()方法用于对字符串的替换。
sub(repl, string[, conut = 0]) subn(repl, string[, count = 0])
其参数含义:
- repl:要替换成的内容
- string:进行内容替换的字符串
- count:可选参数,最大替换次数
3、分割字符串
正则表达式对象的split()方法用于对字符串进行分割。
split(string[, maxsplit = 0])
其参数含义:
- string:要分割的字符串
- maxsplit:可选参数,最大分割次数
七、使用组
组允许将正则表达式分解成几个不容的组成部分,在完成匹配或者搜索后,可以使用组编号访问不同部分匹配的内容。
1、组概述
在正则表达式中以一对圆括号“()”来表示位于其中的内容属于一个组。例如“(re)+”将匹配“rere”,“rerere”等多个“re”重复的情况。组在匹配由不同部分组成的一个整体时非常有用。如电话号码由区号和号码组成,在正则表达式中可以使用两组进来进行匹配:一组匹配区号,另一组匹配后边的号码。
在正则表达式中可以通过使用“(?P<组名>)"为组设置一个名字。
2、组的扩展语法
除了在组中使用“(?P<>)”来命名组名以外,还可以使用以下几种以“?”开头的扩展语法。
- (?iLmsux):设置匹配标志,可以是i、L、m、s、u、x以及它们的组合。其含义与编译标志相同
- (?:...):表示此非一个组
- (?P=name):表示在此之前的名为name的组
- (?=...):用于正则表达式之后,表示如果“=”后的内容在字符串中出现则匹配但不返回“=”后的内容
- (?!...):用于正则表达式之后,表示如果“!”后的内容在字符串中不出现则匹配,但不返回“!”后的内容
- (?<=...):用于正则表达式之前,与(?=...)含义相同
- (?
八、Match对象、
1、使用Match对象处理组
group(),groups()以及groupdict()方法都是处理在正则表达式中使用"()"分组的情况。不同的是,group()的返回值为字符串,当传递多个参数时其返回值为元组。groups()的返回值为元组,groupdict()的返回值为字典。
group([group1, ...]) groups([default]) groupdict([default])
对于group()而言,其参数为分组的编号。如果向group()传递多个参数,则其返回各个参数所对应的字符串组成的元组。对于groups()和groupdcit()一般不需要想起传递参数。
2、使用Match对象处理索引
start()、end()以及span()方法返回所匹配的子字符串的索引。
start( [groupid=0]) end( [groupid=0]) span( [groupid=0])
其参数含义相同,groupid为可选参数,即分组编号如果不想起传递参数,则返回整数个子字符串的索引。start()方法返回子字符串或者组的起始位置索引。end()方法返回子字符串或者组的结束位置索引。而span()方法则以元组的形式返回以上两者。