正则表达式

正则表达式regular expression是各种语言都会用到的东西,比如学PHP的程序员一样也会用到正则表达式,那么正则表达式的本质到底是个什么东西?简单讲,正则表达式的核心本质功能就是通过一套语法从字符串string中通过特定的模式pattern搜索想要找到的内容。因为Python语言的“教学性”,我决定用Python来学习正则表达式。

开始用Python来玩正则表达式

Python和其他类似语言一样,都有强大的字符串函数,甚至更为强大,我们可以通过这些函数实现简单的搜索功能,比如说从字符串“I love you”中搜索是否有“you”这一子字符串。但有些时候,我们只是模糊地知道我们想要找什么,而不能具体说出我是在找“you”,比如说,我想找出字符串中包含的数字,这些数字可以是0到9中的任何一个。这些模糊的目标可以作为信息写入正则表达式,传递给Python,从而让Python知道我们想要找的是什么。

Python标准库中的re包

强大的Python标准库当然一定会有正则表达式的包,这个包叫做re, 在Python中使用正则表达式需要import这个re包。以下的小段代码首先引入re库,然后利用re库中的seach方法在指定的字符串中寻找并呈现找到的任何数字。re.search()接收两个参数,第一个'[0-9]'就是我们所说的正则表达式,它告诉Python的是,“听着,我从字符串abcd2efg想要找的是从0到9的一个数字字符”。re.search()如果从第二个参数找到符合要求的子字符串,就返回一个对象m,你可以通过m.group()的方法查看搜索到的结果。如果没有找到符合要求的字符,re.search()会返回None。

import re
m = re.search('[0-9]','abcd2efg')
print(m.group(0))

还可以试着看看以下代码输出了什么

m = re.search('[0-9]','abcd')
print(m)
m = re.search('[0-9]','abcd43433ddd')
print(m)
m = re.search('[0-9]','abcd43433ddd')
print(m.group())

re是python标准库里的包, re.search是包里面带的方法。

re包中的常用函数介绍

re.search(pattern, string)  # 搜索整个字符串,直到发现符合pattern的子串。
re.match(pattern, string)   # 从第一个字符开始检查字符串是否符合pattern。
re.split(pattern, string)   # 根据pattern分割字符串,结果放在list中返回。
re.findall(pattern, string) # 根据pattern搜索字符串,结果放在list中返回。
re.sub(pattern, replacement, string) # 根据pattern搜索并替换后返回字串。
re.compile()  #以便于提高搜索效率。
>>> s = "ava-efg-ssss-ttt-e-e-e"
>>> m = re.split("-",s)
>>> m
['ava', 'efg', 'ssss', 'ttt', 'e', 'e', 'e']
>>> 
>>> s = "ab-9-efg-ssss-7-ttt-8-9e-e9-e-8"
>>> m = re.findall("[a-z]",s)
>>> m
['a', 'v', 'a', 'e', 'f', 'g', 's', 's', 's', 's', 't', 't', 't', 'e', 'e', 'e']
>>> 
>>> s = "ab-9-efg-ssss-7-ttt-8-9e-e9-e-8"
>>> m = re.findall("[a-z]-[0-9]",s)
>>> m
['b-9', 's-7', 't-8', 'e-8']
>>> 

以上是re的函数

Pattern的语法

看了刚才几个函数,你会发现,会写pattern才是王道,的确,各种编程语言的正则函数不同但类似(比如PHP的都叫grep_啥啥啥的),但pattern的写法就基本是相同了。

1)单个字符:
.任意的一个字符
a|b字符a或字符b
[afg]a或者f或者g的一个字符
[0-4] 0-4范围内的一个字符
[a-f]a-f范围内的一个字符
[^m]不是m的一个字符
\s一个空格
\S一个非空格
\d[0-9]
\D[^0-9]
\w[0-9a-zA-Z]
\W[^0-9a-zA-Z]
2)重复:紧跟在单个字符之后,表示多个这样类似的字符
*重复 >=0 次
+重复 >=1 次
?重复 0或者1 次
{m}重复m次。比如说 a{4}相当于aaaa,再比如说[1-3]{2}相当于[1-3][1-3]
{m, n}重复m到n次。比如说a{2, 5}表示a重复2到5次。小于m次的重复,或者大于n次的重复都不符合条件。
正则表达          相符的字符串举例
[0-9]{3,5}       5677 (将0-9中的任意一个数字重复3次或4次或5次)
a?b              b  (ab or b)
a+b              aaaab (ab,aab,aaab....etc)
3) 位置:
^字符串的起始位置
$字符串的结尾位置
正则表达    相符的字符串举例    不相符字符串
^ab.*c$     abeec             cabeec (如果用re.search(), 将无法找到。)

学会以上几个re的pattern,基本上就差不多了。