烦人的正则表达式(四)

对常用的脚本语言python来说,正则表达式应该是运用非常多的,尤其是用于编写网络爬虫,使用正则表达式能大大提高效率。本人略微懂一点点python,结合学习经历和谷歌又凑了一篇文章出来。

我们需要调用python内置的re模块来使用正则,即我们需要(必须)在文本开头声明:

import re

然后我们就可以开始调用re里面的正则函数来匹配字符串。re模式有两种方式,一种是调用re.compile函数生成pattern对象,再用pattern对象的一系列方法进行文本匹配查找。另一种方式简单粗暴,直接用re.match等方法进行匹配查找。现在我主要介绍第一种。

re.compile — 第一种方式都要调用该函数,功能是将正则表达式转换成pattern对象。一般的表达形式:

pattern = re.compile(strPattern[,flag])

flag为可选模式(默认为0):

- re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)  
- M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)  
- S(DOTALL): 点任意匹配模式,改变'.'的行为
- L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定  
- U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性  
- X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

然后举个例子:

# encoding: UTF-8  
import re  
a = re.compile(r"hello")  
b = re.compile(r"HELLO",re.I)  
match1 = a.match("hello")  
match2 = b.match("hello")  
print (match1.group())  
print (match2.group())

分别输出 hello (match方法稍后介绍)

re.match() — 从字符串的起始位置开始匹配,一次匹配,找到一个匹配的结果就返回,失败则返回None。返回值用group()接收打印。groups()是所有子串组成的集合,group(N)是匹配到的正则表达式第N组的子串。子串是正则表达式里被()括起来的部分,可有多个,因此可划分序号。

import re  
patt = re.compile(r"abc")  
test1 = patt.match("abc")  
test2 = patt.match("abcd")  
test3 = patt.match("ab c")
test4 = patt.match("Aabc")  
if test1:  
    print (test1.group())  
else:  
    print ("false")  
...

结果分别为abc abc false false

re.search() — 扫描整个字符串,并返回第一个匹配成功的结果,否则返回None。整体用法与match()类似,match()匹配需要考虑开头,search()则不用,根据实际情况选择使用。

re.findall() — 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。

re.findall(pattern[,pos,endpos])
pos:起始位置  endpos:结束位置  

re.finditer() — 与re.findall()相似,返回的是迭代器。

re.split() — 按照能够匹配的子串将文本分割并返回列表。

import re  
patt = re.compile(r"\d+") #以数字为分割标志  
print (patt.split("a1b2c3d4e"))

输出:
[‘a’,’b’,’c’,’d’,’e’]

re.sub() — 用于替换字符串中的匹配项。

import re  
patt = re.compile(r'-')  
print (patt.sub('+','a-b-c-d-e'))

输出:
a+b+c+d+e
自感这样写看起来很昏,改用第二种方式:

import re  
print (re.sub(r'-','+','a-b-c-d-e'))

效果一样,这里是把-替换成+

正则表达式语法规则

\d ->数字
\D ->非数字
\s ->空白字符,包括空格换行符换页符等等
\S ->非空白符
\w ->单词字符
\W ->非单词字符