Python实用技术一:正则表达式

317 阅读7分钟

目录

一,正则表达式的基本概念和构成

 二,正则表达式中的特殊字符

三,字符范围和量词

 四,正则表达式的函数

1,re.match函数

 2,re.search函数

3,re.findall函数

4,re.finditer函数

 5,re.sub函数

五,边界符号

六,分组

1,括号中的表达式是一个分组。多个分组按左括号从左到右从1开始依次编号 ​

2, 在分组的右边可以通过分组的编号引用该分组所匹配的子串

3,分组作为一个整体,后面可以跟量词

4,re.findall和分组

 七,‘ | ’的用法

1,表示“或”,如果没有放在" () "中,则起作用范围是直到整个正则表达式开头或结尾或另一个” | “​

2,从左到右短路匹配(匹配上一个后就不计算是否还能匹配后面的)

 3,' | ‘也可以用于分组中,起作用范围仅限于分组内

八,贪婪模式和懒惰模式

1,贪婪模式:

 2,非贪婪(懒惰)模式:

九,匹配对象

这一章主要讲一讲Python学习中比较深层次的内容,需要大家更加认真的学习。

一,正则表达式的基本概念和构成

正则表达式是个某些字符有特殊含义字符串,表示一种字符串的模式(格式),
如:

可以用相关函数求给定字符串和正则表达式的匹配情况

 

 二,正则表达式中的特殊字符

正则表达式中常见的特殊字符有以下几个:

 如果要在正则表达式中表示这几个字符本身,就应该在其前面
加    \

 

三,字符范围和量词

用以表示“此处必须出现一个某某范围内的字符”,或者“此处必须出现一一个字符,但不可以是某某范围内的字符” ,但不可以十某某范围内的字符。

汉字的unicode编码范围是4e00- 9fa5(16进制)因此[ \u4e00-\u9fa5]即表示一个汉字。

量词的用法: 

正则表达式的例子:

 

 四,正则表达式的函数

1,re.match函数

re . match (pattern,string,flags=0)

●从字符串str ing的起始位置匹配一一个模式pattern
●flags标志位, 用于控制模式串的匹配方式,如:是否区分大小写,多行匹配等等,如re.M| re. |表示忽略大小写, 且多行匹配
●成功则返回一个匹配对象,否则返回None

​ 

 

​ 

 2,re.search函数

re.search(pattern, string, flags = 0)

查找字符串中可以匹配成功的子串。
若匹配成功,则返回匹配对象;若无法匹配,则返回None。

 输出字串及起止位置。

3,re.findall函数

re.findall(pattern, string, flags = 0)

查找字符串中所有和模式匹配的子串(不重叠)放入列表。一个子串都找不到就返回空表[]。

4,re.finditer函数

re.finditer (pattern, string, flags = 0)

查找字符串中所有和模式匹配的子串(不重叠),每个子串对应于一个匹配对象,返回匹配对象的序列(准确说是“可调用迭代器”)

 5,re.sub函数

re. sub (模式串,替换串,母串) 用于替换匹配的子串

 

五,边界符号

\A        表示字符串的左边界,即要求从此往左边不能有任何字符
\Z        表示字符串的右边界,即要求从此往右边不能有任何字符
^        与\A同。但多行匹配模式下还可以表示一行文字的左边界
$        与\Z同。但多行匹配模式下还可以表示一行文字的右边界

边界符号本身不会和任何字符匹配。
Python字符串"A', \Z'都是两个字符,而不是像"\n'那样的一个字符。

\b        表示此处应为单词的左边界或右边界,即不可是单词字符
\B        表示此处不允许是单词的左边界或右边界,即必须是单词字符

正则表达式的边界符号"b'是两个字符。但是在Python字符串中,'\b'和"\t,'n'类似,是一个字符(Backspace)。 因此在正则表达式中使用边界符号\b,要写"\b'。如果写'\b', 则连续的两个"\被看作是一个普通的" \ “, 不会和后面的'b'一起被当作字符组合,变成边界符号'\b'。

print("\b")         #>>\b

六,分组

1,括号中的表达式是一个分组。多个分组按左括号从左到右从1开始依次编号  

2, 在分组的右边可以通过分组的编号引用该分组所匹配的子串

 

 

3,分组作为一个整体,后面可以跟量词

 

 

 不要求分组的多次出现必须匹配相同字符串

4,re.findall和分组

1)在正则表达式中没有分组时,re. findall返回所有匹配子串构成的列表。有且只有一一个分组时,re. finda11返回的是- -个子串的列表,每个元素是一个匹配子串中分组对应的内容。

2)在正则表达式中有超过一个分组时,re . findall返回的是一个元组的列表,每个元组对应于一-个匹配的子串,元组里的元素,依次是1号分组、2号分组、3号分组......匹配的内容

 七,‘ | ’的用法

1,表示“或”,如果没有放在" () "中,则起作用范围是直到整个正则表达式开头或结尾或另一个” | “

 

2,从左到右短路匹配(匹配上一个后就不计算是否还能匹配后面的)

 

 3,' | ‘也可以用于分组中,起作用范围仅限于分组内

 

 

八,贪婪模式和懒惰模式

1,贪婪模式:

量词+,*,?, {m,n}默认匹配尽可能长的子串

 2,非贪婪(懒惰)模式:

在量词+,*,?, {m,n}后面加"?'则匹配尽可能短的字符串。

 

九,匹配对象

groups([default]):
以元组形式返回全部分组匹配的字符串。相当于调用group(1 ,2,.. .last)。
default表示没有匹配字符串的组以这个值替代,默认为None。


groupdict([default]): .
返回以有名字的组的名字为键、以该组匹配的子串为值的字典,没有
名字的组不包含在内。default含义同上。


start([group]):
返回指定的组匹配的子串在string中的起始位置。group默认值 为0。


end([group]):
返回指定的组匹配的子串在string中的结束位置(子串最后一个字符的
位置+1)。group默认值为0。

span([group]):
返回(start(group), end(group))。
group可以是组编号,也可以是组名字,缺省为0

一般来说,要写一个精确的正则表达式是很困难的,所以我们可以讲正则表达式写的宽容一些,即,匹配到的不一定是正确的,但是正确的一定可以匹配到。