python学习笔记(十)之正则表达式

正则表达式

  • (一) 正则表达式的介绍
  • (二) 正则表达式的语法
    • 2.1 非打印字符:
    • 2.2 特殊字符:
    • 2.3 限定符:
    • 2.4 定位符:
    • 2.5 选择:
    • 2.6 反向引用:
  • (三)python中的正则表达式
    • 3.1 re.match方法
    • 3.2 re.search方法
    • 3.3 re.sub方法

(一) 正则表达式的介绍

正则表达式(Regular Expression) 是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式的功能:

	1:测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。
	2:替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。
	3:基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。

使用正则表达式的流程:
1、导入包
2、根据需求制定正则表达式
3、编译自定义的表达式
4、根据其表达式进行匹配
5、输出结果

(二) 正则表达式的语法

2.1 非打印字符:

字符 描述
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配字母数字及下划线
\W 匹配非字母数字及下划线
\d 匹配任意数字,等价于[0-9]
\D 匹配任意非数字
\A 匹配字符串的开始
\z 匹配字符串结束
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的字符串结束
\G 匹配最后匹配完成的位置
\b 匹配一个单词边界的字符,也就是单词和空格边间的位置
\B 匹配非单词边界
\数字n 匹配第n个分组的内容

2.2 特殊字符:

若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。

特殊字符 描述
$ 匹配输入字符串的结尾位置。要匹配 $ 字符本身,请使用 \ $。
() 标记一个子表达式的开始和结束位置。要匹配这些字符,请使用 \ ( )
* 匹配前面的子表达式零次或一次
. 匹配除换行符\n之外的所有单字符。要匹配 . ,请使用 \ . 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \ [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \ ?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 '\ \ ’ 匹配 "\ ",而 ‘\ (’ 则匹配 “(”。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \ ^。
{ 标记限定符表达式的开始。要匹配 {,请使用 {。
re* 匹配0个或多个的表达式
re+ 匹配一个或多个的表达式
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{n} 匹配n个前面的表达式
re{n,} 匹配至少n个前面的表达式
re{m,n} 匹配m到n次有前面表达式定义的片段,贪婪方式
a\b 匹配a或b
(re) 对正则表达式分组,并记住匹配的文本

2.3 限定符:

字符 描述
* 匹配前面的子表达式零次或多次。* 等价于{0,}
+ 匹配前面的子表达式一次或多次。+ 等价于 {1,}。
匹配前面的子表达式零次或一次。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。
{n,} n是一个非负整数。至少匹配n 次。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{m,n} m 和 n 均为非负整数,其中m<= n。最少匹配 m次且最多匹配 n 次。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

限定符的使用如下:
① 匹配一个正整数:
/[1-9][0-9]*/
[1-9]表示第一个数字不是0,[0-9]*表示任意多个数字
python学习笔记(十)之正则表达式_第1张图片
② 匹配一个0-99的两位数:
/[0-9]{1,2}/
③ 匹配一个1-99的两位数:
/[1-9][0-9]?//[1-9][0-9]{0,1}/

④ 贪婪与非贪婪:

	* 和 + 限定符都是贪婪的,他们会尽可能多的匹配字符,在他们后面加上?,可以实现非贪婪或最小匹配
/<.*>/
#匹配从第一个<到最后一个>之间的所有内容——贪婪

/<.*?>/
#匹配从第一个<到第一个>之间的所有内容——非贪婪

2.4 定位符:

定位符用来描述字符串或单词的边界。

字符 描述
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结尾位置
\b 匹配一个单词的边界,即字与空格间的位置。如果它位于要匹配的字符串的开始,它在单词的开始处查找匹配项。如果它位于字符串的结尾,它在单词的结尾处查找匹配项。
\B 非单词边界匹配。即匹配的字符串出现在非单词边界处

不能将限定符与定位符放在一起使用

/<\bchar>/ #在单词开头处查找
/<ter\b>/ #在单词结尾处查找

2.5 选择:

()可将所有选择项括起来,相邻的选择项之间用 | 分隔开。

2.6 反向引用:

(三)python中的正则表达式

3.1 re.match方法

re.match从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
语法:re.match(pattern,string,flags=0)
pattern : 匹配的正则表达式
string : 要匹配的字符串
flags : 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

  • 获取匹配表达式的方法:
方法①:group(num=0)
匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。

方法②:groups()
返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

3.2 re.search方法

re.match 扫描整个字符串,并返回第一个成功的匹配。若匹配不成功,则返回None.
语法:re.search(pattern,string,flags=0)

import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) 
if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"
#以上实例执行结果如下:
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

3.3 re.sub方法

re.sub可以替换字符串的匹配项。
语法:re.sub(pattern,repl,string,count=0,flags=0)
pattern:正则中的模式字符串
repl:替换的字符串,也可为一个函数
string:要被查找替换的字符串
count:模式匹配成功后,替换的最大次数,默认0表示替换所有的匹配。
flags:编译时用的匹配模式,数字形式

你可能感兴趣的:(python基础)