目录
1、字符匹配
1.1、匹配字符的规则
1.2、匹配字符的个数
2、re的简单使用
3、模块级函数
一般在文本处理的时候,会遇到字符处理的问题,Python提供的re模块是一个做文本匹配的基础模块,它主要是通过制定的规则找出文本中符合条件的子字符或者子字符串。
根据条件,做单个的字符匹配,字符匹配的规则由两部分组成,一个是匹配的字符形式,比如大小写字母、数字等字符,另一部分则是字符重复的次数。
在正则匹配中的元字符有: . ^ $ * + ? { [ ] \ | ( )。这些元字符的主要作用是跟其它的标准字符一起组成匹配的规则,所以可以认为它们是带有其它作用的特殊字符。
(1)通过正反括号"["和"]"确定要匹配的字符
“[]”这个括号里面可以例举出想要匹配的字符集合,也可以通过限定字符集的范围确定。例如,[abc] 和[a-c]都表示匹配"a", "b", 或 "c"中的任意一个字符。
如果字符本身是元字符,那么它在 “[]”里面的时候就是一个普通字符,例如:[[]就是表示匹配字符“[”。
(2)取反元字符 ^ 的使用
在方括号中,首字符如果使用取反字符^的话,就表示匹配初括号中的字符之外的其它字符。例如,[^5] 将匹配除 "5" 之外的任意字符。
(3)反斜杠“\”的使用
反斜杠主要的作用的是,将那些在正则匹配中有特殊意义的字符转换成普通的字符,或者将普通字符标记成它代表的特殊意义。例如,在Python中,我们用一对英文双引号""来标记字符串,这个时候如果我们在字符串中想把英文双引号当做一个普通字符来处理,那么就可以用反斜杠"\"来转义一下,"\""表示的就是普通英文双引号"这个字符,如果再加一个斜杠"\\"",则又转义回了其作为字符串标记的功能,那么就需要再加一个同样功能的双引号跟它配对,比如"\\"""就表示两个字符串的标记。反斜杠也可以用来确定要匹配的字符类型,规则如下:
\d 匹配任何十进制数;它相当于类 [0-9]。 \D 匹配任何非数字字符;它相当于类 [^0-9]。 \s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。 \S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。 \w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。 \W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
这样特殊字符都可以包含在一个字符类中。如,[\s,.]字符类将匹配任何空白字符或","或"."。
(4)元字符“.”的使用
. 它匹配除了换行字符外的任何字符,在 alternate 模式(re.DOTALL)下它甚至可以匹配换行。"." 通常被用于你想匹配“任何字符”的地方。
re中主要使用*、+、?还有花括号{}来确定匹配的字符的个数
(1)*指定前一个字符可以被匹配零次或更多次,而不是只有一次。ca*t 将匹配 "ct" (0 个 "a" 字符), "cat" (1 个 "a"), "caaat" (3 个 "a" 字符)等等
(2)+表示匹配一或更多次。用同一个例子,ca+t 就可以匹配 "cat" (1 个 "a"), "caaat" (3 个 "a"), 但不能匹配 "ct"。
(3)? 匹配一次或零次;你可以认为它用于标识某事物是可选的。例如:home-?brew 匹配 "homebrew" 或 "home-brew"。
(4){m,n},其中 m 和 n 是十进制整数。该限定符的意思是至少有 m 个重复,至多到 n 个重复。举个例子,a/{1,3}b 将匹配 "a/b","a//b" 和 "a///b"。它不能匹配 "ab" 因为没有斜杠,也不能匹配 "ab" ,因为有四个。
re的常用方法如下:
方法/属性 | 作用 |
match() | 决定 RE 是否在字符串刚开始的位置匹配 |
search() | 扫描字符串,找到这个 RE 匹配的位置 |
findall() | 找到 RE 匹配的所有子串,并把它们作为一个列表返回 |
finditer() | 找到 RE 匹配的所有子串,并把它们作为一个迭代器返回 |
如果没有匹配到的话,match() 和 search() 将返回 None。如果成功的话,就会返回一个 `MatchObject` 实例,其中有这次匹配的信息:它是从哪里开始和结束,它所匹配的子串等等。从使用的例子来看,match和search一般返回第一个匹配到的子串,而findall和finditer返回的是符合条件的所有子串。
(1)match的使用
step 1:通过re.compile()生成一个pattern对象
step 2:通过pattern去匹配字符串
例1:
import re
s = "ahahha123"
p = re.compile("[a-z]+")
print(p.match(s))
output:
字符串s的匹配结果为: <_sre.SRE_Match object; span=(0, 6), match='ahahha'>
结果的查看, MatchObject 实例也有几个方法和属性;最重要的那些如下所示:
方法/属性 | 作用 |
group() | 返回被 RE 匹配的字符串 |
start() | 返回匹配开始的位置 |
end() | 返回匹配结束的位置 |
span() | 返回一个元组包含匹配 (开始,结束) 的位置 |
如下面的例子可以看到,匹配的对象主要返回的是匹配的字符串,以及匹配到的字符串的开始和结束的位置。例2:
s = "ahahha123"
p = re.compile("[a-z]+")
result = p.match(s)
print(result.group())
print(result.start())
print(result.end())
print(result.span())
output:
ahahha
0
6
(0, 6)
(2)search()的使用
s = "123ahahha1xxx23wuwuuwu"
p = re.compile("[a-z]+")
result = p.search(s)
print(result.group())
print(result.start())
print(result.end())
print(result.span())
output:
ahahha
3
9
(3, 9)
(3)findall()
返回所有符合条件的子串,感觉一般文本处理里面最实用的用法。
s = "123ahahha1xxx23wuwuuwu"
p = re.compile("[a-z]+")
result = p.findall(s)
print(result)
output:
['ahahha', 'xxx', 'wuwuuwu']
(4)finditer()的用法
这个方法返回的结果跟match和search一样,是一个匹配到的对象,然后再通过对象的方法返回具体匹配到的值和位置。
s = "123ahahha1xxx23wuwuuwu"
p = re.compile("[a-z]+")
result = p.finditer(s)
for i in result:
print(i)
print(i.group())
print(i.start())
print(i.end())
print(i.span())
output:
<_sre.SRE_Match object; span=(3, 9), match='ahahha'>
ahahha
3
9
(3, 9)
<_sre.SRE_Match object; span=(10, 13), match='xxx'>
xxx
10
13
(10, 13)
<_sre.SRE_Match object; span=(15, 22), match='wuwuuwu'>
wuwuuwu
15
22
(15, 22)
之前都是先调用compile()先生成一个pattern,然后再用不同的搜索方式去字符串中匹配这个pattern,这个方式比较麻烦,还有一种比较简单的用法,也是比较符合直观思维的用法,如下:
print(re.match(r'From\s+', 'From age amk'))
print(re.search(r'From\s+', 'From age amk'))
print(re.findall('}', '{block}}'))
output:
<_sre.SRE_Match object; span=(0, 5), match='From '>
<_sre.SRE_Match object; span=(0, 5), match='From '>
['}', '}']
参考原文:Python正则表达式操作指南