正则表达式(regular expression)是一个特殊的字符序列,它能够帮助我们检查一个字符串是否与某种模式匹配。
Python中的re
模块为python提供了类似于Perl风格的正则表达式的全部功能。
compile
函数根据一个模式字符串和可选标志参数生成一个正则表达式对象,该对象拥有一系列方法用于正则表达式的匹配和替换,re模块提供了和这些功能和方法一致的函数,这些函数使用一个模式字符串作为它们的第一个参数。
正则表达式对象
re.compile(pattern[,flags])
用于编译正则表达式,返回RegexObject对象
import re
pattern = re.compile(r'\d')
pattern.match('ABC123def456',5,12) #<re.Match object; span=(5, 6), match='3'>
pattern.search('ABC123def456',6,12) #<re.Match object; span=(9, 10), match='4'>
group()
返回被RE匹配到的字符串
-
start()
返回匹配开始的位置 -
end()
返回匹配结束的位置 -
span()
返回一个元组,对应匹配开始和结束的位置
pattern = re.compile(r'(([a-z]+) .* ([a-z]+)) .* .*',re.I)
m = pattern.match('Life is short, you need python!')
m.group() #'life is short you need python'
m.group(1) #'life is short you'
m.group(2) #'life'
m.group(3) #'you'
re模块函数
re模块函数一般使用方式re.func_name(pattern, string, flags=0)
,flags为标志位,控制正则表达式的匹配方式,比如不区分大小写,多行匹配等。
1、re.match(pattern, string, flags=0)
函数,尝试从字符串起始位置匹配一个模式,匹配成功返回一个re.Match实例,起始位置没有匹配到或没有匹配到,返回None
re.match('www','www.google.com').group() #www
re.match('www','www.google.com').span() #(0,3)
print(re.match('com','www.google.com')) #None
2、re.search(pattern, string, flags=0)
函数,扫描整个字符串并返回第一个成功的匹配
re.search('TATA','AATTACGATATAAGTATAC') #<re.Match object; span=(8, 12), match='TATA'>
re.search('TATA','AATTACGATATAAGTATAC').span() #(8,12)
3、re.sub(pattern, repl, string, count=0, flags=0)
函数,用于替换字符串中的匹配项
语法:re.sub(pattern, repl, string, count=0, flags=0)
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
flags : 编译时用的匹配模式,数字形式。
前三个为必选参数
re.sub(r'\D','','133-1234-1234') #13312341234
4、re.findall(string[, pos[, endpos]])
函数,在字符串中查找RE匹配到的所有字符串,返回一个列表,如果没有匹配到返回一个空列表
re.findall(r'\d+','ABC123def456') #['123', '456']
pattern = re.compile(r'\d+')
pattern.findall('ABC123def456',5,12) #['3', '456']
re.findall(r'www.(baidu|google).com','www.google.com') #['google']
re.findall(r'www.(?:baidu|google).com','www.google.com') #['www.google.com']
5、re.finditer(pattern, string, flags=0)
函数,和findall类似,查找字符串中所有和RE匹配的字符串,将结果作为一个迭代器返回
pattern = re.compile(r'\d+')
for i in pattern.finditer('ABC123def456',5,12):
print(i)
#<re.Match object; span=(5, 6), match='3'>
#<re.Match object; span=(9, 12), match='456'>
6、re.split(pattern, string[, maxsplit=0, flags=0])
函数,按匹配到的字符串将字符串分割,返回列表
re.split('[;,:]','A;B,C') #['A', 'B', 'C']
re.split('[;,:]','A;B,C',1) #['A', 'B,C']
re.split(r'([;,])','A;B,C') #['A', ';', 'B', ',', 'C'] 在匹配模式上加()可以保留匹配的项
re.split(r'\W','life is\tshort\nyou\rneed\fpython') #['life', 'is', 'short', 'you', 'need', 'python']
正则表达式模式
字符
元字符 | 匹配内容 |
---|---|
. | 匹配除换行符以外的所有字符 |
\w | 匹配数字字母或下划线 |
\W | 匹配非数字字母或下划线 |
\s | 匹配任意空白符 |
\S | 匹配非空白符 |
\d | 匹配数字 |
\D | 匹配非数字 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
a|b | 匹配字符a或者字符b |
() | 匹配括号内的表达式,也表示组 |
[...] | 匹配字符组中的字符 |
[^...] | 匹配除字符组中的所有字符 |
\数字 | 匹配第几个分组 |
量词
量词 | 说明 |
---|---|
* | 重复零次或多次 |
+ | 重复一次或多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n次到m次 |
基因组中微卫星序列的提取
seq = 'AATCATACGTATATATATATAGCTTATTATTACTAGCT'
for i in re.finditer(r'([ATCG]{2,6})\1{2,}',seq):
print(i.group(),i.span())
修饰符
正则表达式有一些可选修饰符来控制匹配的模式,修饰符被指定为可选的标志,多个标志可以按位或(|)来进行指定。
修饰符 | 描述 |
---|---|
re.I | 使匹配对大小写不敏感 |
re.L | 做本地化识别匹配 |
re.M | 多行匹配,影响^和$ |
re.S | 使.匹配包括换行在内的所有字符 |
re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B. |
re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解 |