常用的Python正则表达式

在写Python爬虫的时候经常要用到正则表达式,今天把比较常用的一些用法总结记录一下
首先需要导入re模块

1
import re

start(),end()和span()函数

start()

返回匹配的起始位置。如:

1
2
re.search(r'\d+', 'asdf13df234').start()
4

索引位置是从0开始计数的。

end()

返回匹配结束的下一个位置。如:

1
2
re.search(r'\d+', 'asdf13df234').end()
6
span()

返回匹配的区间,左闭右开。如:

1
2
re.search(r'\d+', 'asdf13df234').span()
(4, 6)

group()函数

获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。编号0代表匹配的整个子串;默认返回group(0);没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。

groups()函数

以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。没有截获字符串的组以默认值None代替。

re.match函数

re.match 从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
函数语法:

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

例子:

1
2
print(re.match('www', 'www.abc.com').span())  # 在起始位置匹配
print(re.match('com', 'www.abc.com')) # 不在起始位置匹配

运行结果:

1
2
(0, 3)
None

re.search函数

re.search 扫描整个字符串并返回第一个成功的匹配。匹配成功re.search方法返回一个匹配的对象,否则返回None。
函数语法:

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

例子:

1
2
3
4
5
6
print(re.search('www', 'www.abc.com').span())  # 在起始位置匹配
print(re.search('com', 'www.abc.com').span()) # 不在起始位置匹配

运行结果:
(0, 3)
(8, 11)

re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

re.sub函数

re.sub用于替换字符串中的匹配项。
语法:

1
re.sub(pattern, repl, string, count=0, flags=0)
  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。

例子;

1
2
3
a="0123-456-789"
b=re.sub(r'\D',"",a)
print "b"

运行结果:

1
0123456789

re.compile函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。

语法格式为:

1
re.compile(pattern[, flags])

例子:

1
2
3
4
5
6
7
8
9
10
pattern = re.compile(r'\d+')                    # 用于匹配至少一个数字
>>> m = pattern.match('one12twothree34four') # 查找头部,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配
>>> print m
None
>>> m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配
>>> print m # 返回一个 Match 对象
<_sre.SRE_Match object at 0x10a42aac0>

findall函数

在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
re.match 和 re.search 是匹配一次 ,而findall 匹配所有。
例子:

1
2
3
4
5
pattern = re.compile(r'\d+')   # 查找数字
result1 = pattern.findall('runoob 123 google 456')
result2 = pattern.findall('run88oob123google456', 0, 10)# 从0开始匹配,到10结束
print(result1)
print(result2)

运行结果:

1
2
['123', '456']
['88', '12']

re.finditer
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

re.split函数

split 方法按照能够匹配的子串将字符串分割后返回列表。
语法:

1
re.split(pattern, string[, maxsplit=0, flags=0])

例子:

1
2
3
4
5
6
7
8
re.split('\W+', 'runoob, runoob, runoob.')
['runoob', 'runoob', 'runoob', '']

re.split('(\W+)', ' runoob, runoob, runoob.')
['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', '']

re.split('\W+', ' runoob, runoob, runoob.', 1)
['', 'runoob, runoob, runoob.']

元字符

  • . 匹配任意字符(不包括换行符)
  • ^ 匹配开始位置,多行模式下匹配每一行的开始
  • $ 匹配结束位置,多行模式下匹配每一行的结束
    • 匹配前一个元字符0到多次
    • 匹配前一个元字符1到多次
  • ? 匹配前一个元字符0到1次
  • {m,n} 匹配前一个元字符m到n次
  • \ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\.只能匹配.,不能再匹配任意字符
  • [] 字符集,一个字符的集合,可匹配其中任意一个字符
  • | 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
  • (…) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照”(“的顺序决定索引值
  • (?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I
  • (?:…) 分组的不捕获模式,计算索引时会跳过这个分组
  • (?P…) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
  • (?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则
  • (?#…) 注释,不影响正则表达式其它部分,用法参见 模式 I
  • (?=…) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则
  • (?!…) 顺序否定环视,表示所在位置右侧不能匹配括号内正则
  • (?<=…) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
  • (?<!…) 逆序否定环视,表示所在位置左侧不能匹配括号内正则
  • (?(id/name)yes|no) 若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
  • \number 匹配和前面索引为number的分组捕获到的内容一样的字符串
  • \A 匹配字符串开始位置,忽略多行模式
  • \Z 匹配字符串结束位置,忽略多行模式
  • \b 匹配位于单词开始或结束位置的空字符串
  • \B 匹配不位于单词开始或结束位置的空字符串
  • \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_]
-------------本文结束感谢您的阅读-------------
/*
*/