python3 re模块的使用

正则表达式(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 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358