正则表达式

有些人在碰到问题时,就想:“我知道,我可以使用正则表达式。“现在,他们就有了两个问题。

                                          -----------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()方法则以元组的形式返回以上两者。

posted @ 2019-10-05 17:05  Mr-Yao  阅读(200)  评论(0编辑  收藏  举报