0%

python-正则表达式

Python_正则表达式

正则表达式是常用于字符串匹配。之前也曾系统的看过相关的内容,但是一段时间不用发现又很陌生,特将相关内容记录如下。

正则表达式本身适用于匹配含有某种特征的字符串,从而对字符串进行相关处理(分割、替换、匹配等)。Python语言通过re库支持正则表达式。

正则表达式简介

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

一个正则表达式由运算符与操作符构成,而运算符与操作符又可以分为若干种类。

运算符

表示待匹配字符本身的符号,[a-z] 表示由a到z的单个字符。

普通运算符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。这里的元字符可以单纯的理解为具有特殊含义的字符,不需要记忆。

特殊运算符

特殊运算符指的是利用转义字符表示特定字符的表示。可理解为对常见的运算符进行了约定表达,以达到简化的目的。

这里仅列举了常见的特殊运算符。

符号 含义
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]’。
\W 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

操作符

用于表示对运算符的某种操作,通常是限定符号。

字符 含义
$ 匹配结尾位置
( ) 标记一个子表达式的开始和结束位置
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
^ 匹配输入字符串的开始位置
{n} n 是一个非负整数。匹配确定的 n 次。
{n,} n 是一个非负整数。至少匹配n 次。
{n,m} 最少匹配 n 次且最多匹配 m 次

通过上述运算符+操作符可以表示任意符号,根据应用场景千变万化。

Python 中正则表达式的应用

Python中采用re库对正则表达式进行处理。其正则表达式的调用方式分为两种:1.库直接调用 2.利用正则表达式对象调用。这里的关系我认为与类同对象的关系一致。

库调用

1
2
3
4
5
6
#实例
import re
#匹配一个或多个字母
match = re.search(r"[a-zA-Z]+" ,"We are the chamion" )
print(match.group(0))
#Result : We

直接使用库函数调用方法即可。主要方法如下:

函数调用 说明
re.search() 搜索匹配的第一个,并返回match对象
re.match() 开始位置匹配符合正则的字符串,并返回match对象
re.findall() 搜索字符串,以列表形式返回全部匹配的字符串
re.split() 按照正则表达式分割原始字符串,并返回列表类型
re.finditer() 搜索字符串,返回符合匹配结果的迭代类型,每个迭代元素均为match对象
re.sub() 替换符合正则表达的子串为特定字符串,返回替换后的字符串

简单实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#实例
import re
#匹配一个或多个字母
match = re.search(r"[a-zA-Z]+" ,"We are the 45 chamion 123" )
print(match.group(0))
# We

match = re.match(r"[a-zA-Z]+" ,"We are the 45 chamion 123" )
print(match.group(0))
# We

matchList = re.findall(r"[a-zA-Z]+" ,"We are the 45 chamion 123" )
print(matchList)
# ['We', 'are', 'the', 'chamion']

splitList = re.split(r"[a-zA-Z]+" ,"We are the 45 chamion 123" )
print(splitList)
# ['', ' ', ' ', ' 45 ', ' 123']

iterMatch = re.finditer(r"[a-zA-Z]+" ,"We are the 45 chamion 123" )
for match in iterMatch:
print(match.group(0))
# We
# are
# the
# chamion


subResult = re.sub(r"[a-zA-Z]+" ,"zzz" ,"We are the 45 chamion 123" )
print(subResult)
# zzz zzz zzz 45 zzz 123

上面仅仅是简单的实例,具体每个方法可以设置的参数都为细讲,可在应用时再看。

通过观察方法表中对每种方法的描述,我们可以发现match对象多次提及,其相应的属性与方法可简单了解。

regex对象调用

选择用regex对象调用上述方法的好处为,对于同一个正则表达式多次使用时可以减少系统默认的多次编译正则表达式次数。调用形式与库调用一致,理解为类与对象的关系即可。

调用实例

1
2
3
4
5
import re 
#先编译,返回一个regex对象
regex = re.compile(r"[a-z]+")
#在调用相关方法即可
regex.search("String")

Match对象

在上述方法中,多个方法返回的为match对象,其有自己的属性与方法,需要简单的了解下。

Match对象的属性

属性 说明
.string 待匹配的文本
.re 匹配时使用的pattern对象,即正则
.pos 正则搜索文本的开始位置
.endpos 正则搜索的结束位置

Match对象的方法

方法 说明
.group(0) 获得匹配的字符串
.start() 匹配字符串在原始字符串中的起始位置
.end() 匹配字符串在原始字符串中的结束位置
.span() 返回(.start() , .end())

本文中包含由正则表达的含义,与基本的用法 + Pyhon库re对于正则表达式的用法。多是用于理解与了解必要的使用方法与框架,并没有涉及具体的代码演示。个人认为正则的使用,跟需要在应用过程中进行。