Python常用正则表达式学习笔记

目录:

  1. 正则表达式常用方法
  2. 编译正则表达式
  3. flags控制匹配方式
  4. (?)参数
  5. 匹配模式
  6. 举例
import re#正则表达式
#正则表达式常用方法
match_result=re.match(pattern,string,flags)#以pattern正则表达式从string起始位置匹配 只返回一个 无匹配结果返回None
search_result=re.search(pattern,string,flags)#以pattern正则表达式搜索string直到找到一个匹配 只返回一个 无匹配结果返回None
sub_result=re.sub(pattern,substitute,string,count,flags)#以pattern正则表达式搜索string 找到一个匹配 将匹配字符串替换为substitute 无匹配结果返回None 替换count次 默认全部替换 substitute可以是函数
split_result=re.split(pattern,string,count,flags)#以pattern正则表达式匹配string后返回列表
def multiply_2(matched):return str(int(matched.group('value')) * 2)
'A46G8HFD1134'==re.sub(r'(?P<value>\d+)', multiply_2, 'A23G4HFD567')#将字符串中的数字x2

#编译正则表达式
regex_pattern=re.compile(pattern,flags)#生成一个正则表达式
match_result=regex_pattern.match(string,start_index,end_index)#返回一个match对象
fullmatch_result=regex_pattern.fullmatch(string,start_index,end_index)#整个 string 匹配正则表达式 才返回 否则返回None
match_result.group(index)#返回匹配组 0表示所有分组组成的字符 group从1开始
match_result.start()#返回匹配结果第一个字符在string的索引
match_result.end()#返回匹配结果最后一个字符在string的索引
match_result.span()#返回(start_index,end_index)
search_result=regex_pattern.search(string,start_index,end_index)#返回一个search对象 用法同match对象
findall_result=regex_pattern.findall(string,start_index,end_index)#返回所有匹配组成的列表 匹配所有 如果没有匹配返回空列表 如果正则表达式分组 返回由分组组成的每个元组组成的列表
finditer_result=regex_pattern.finditer(string,start_index,end_index)#和findall类似 但返回迭代器
sub_result=regex_pattern.sub(substitute,string,count,flags)#将匹配字符串替换为substitute后返回string 无匹配结果返回原string 替换count次 默认全部替换 substitute可以是函数
subn_result=regex_pattern.subn(substitute,string,count,flags)#和 sub类似 但返回元组 (string,count)
escape_result=regex_pattern.escape(pattern)#转义pattern中具有正则表达式特殊含义的字符
'|'.join(map(re.escape, sorted(['+', '-', '*', '/', '**'], reverse=True)))==r'/|\-|\+|\*\*|\*'

#flags控制匹配方式
re.I#re.IGNORECASE 忽略字母大小写
re.A#re.ASCII 只匹配ASCII字符
re.DEBUG#显示编译时的debug信息
re.L#re.LOCALE 基本没用 只能对byte样式有效 由当前语言区域决定 \w, \W, \b, \B 和大小写敏感匹配
re.M#re.MULTILINE 使^除了匹配整个字符串的起始位置,还匹配换行符\n后面的位置 $除了匹配整个字符串的结束位置,还匹配换行符\n前面的位置
re.S#re.DOTALL 使 . 能够匹配所有字符
re.X#re.VERBOSE 忽略表达式中的空白 和 #注释 让长正则表达式易于理解
verbose_regex = re.compile(
r'''( (\d{3}|\(\d{3}\))?    # area code
(\s|-|\.)?                  # separator
\d{3}                       # first 3 digits
(\s|-|\.)                       # separator
\d{4}                       # last 4 digits
)''',re.X)
re.findall(r'^This.*?line.$', 'This is the first line.\nThis is the second line.\nThis is the third line.', flags=re.M+re.S)==['This is the first line.', 'This is the second line.', 'This is the third line.']#匹配多行文本的每一行
flags=re.M | re.S#另一种flags表示
re.findall(r'(?ms)^This.*?line.$')#另一种flags表示 这种表达方式不需要写flags 但必须在表达式开头用(?)声明 可选参数有(?aiLmsux)

#(?)参数
(str)#分组 索引从1开始 0表示所有组组成的字符串
(?aiLmsx)#字母分别代表 re.A I L M S X 必须在表达式开头使用
(?:str)#在使用group之类的函数时忽略该组
(?P<group_name>str)#为该组命名 使用groupdict()时键为group_name 值为匹配的组
(?P=group_name)#引用(?P<group_name>str)
(?#str)#str会被忽略 当作注释
(?=str)#只有匹配到str的时候 才会匹配(?=str)前面的表达式
(?!str)#只有没有匹配到str的时候 才会匹配(?!str)前面的表达式
(?<=str)#在字符串非开始位置匹配以str开头的字符串 只能是明确的长度 可以理解成 ^str 在字符串非开始位置匹配符合字符
(?<!str)#在字符串非开始位置匹配不以str开头的字符串 只能是明确的长度 可以理解成 ^str 在字符串非开始位置匹配不符合字符
(?(group_index/group_name)yes-pattern|no-pattern)#如果给定的 group_index 或 group_name 存在,将会尝试匹配 yes-pattern ,否则就尝试匹配 no-pattern,no-pattern 可选,也可以被忽略。比如,
r'(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)'#是一个email样式匹配,将匹配 '<user@host.com>' 或 'user@host.com' ,但不会匹配 '<user@host.com' ,也不会匹配 'user@host.com>'
match_result.group()#返回匹配的整个结果
match_result.group(int)#返回匹配结果的第int组 从1开始
match_result.groups()#返回匹配的所有组
match_result.groupdict()#返回匹配的所有组名和组组成的字典 键为组名 值为匹配的组

#匹配模式
r'pattern'#r表示忽略转义字符 写正则表达式加上就行
贪婪模式#有多种匹配字符串符合正则表达式 匹配字符串最长的 默认模式
非贪婪模式#有多种匹配字符串符合正则表达式 匹配字符串最短的 用?在正则式结尾修饰 如 .*?
'^str'#只匹配以str开头的字符串 caret ^必须在$之前 caret before dollar ==abcd
'str$'#只匹配以str结尾的字符串 dollar ^必须在$之前 caret before dollar ==abcd
.#匹配任意一个除了\n的字符 当re.M标记被指定时 则可以匹配包括换行符的任意字符
[str]#匹配在[]的一个字符 如[amk] 匹配 'a' 'm'或'k'
[^str]#不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符
(str)*#匹配0个到n个str 贪婪模式
(str)*?#匹配0个到n个str 非贪婪模式
(str)+#匹配1个到n个str 贪婪模式
(str)+?#匹配1个到n个str 非贪婪模式
(str)?#匹配时str可有可无 贪婪模式
(str)??#匹配时str可有可无 非贪婪模式 即匹配结果为空 ""
(str){ x}#只匹配重复x次的str 例如  (o){2} 不能匹配 "Bob" 中的 "o" 但是能匹配 "food" 中的两个 o
(str){ x,}#只匹配重复x次到n次的str 例如  o{2,} 不能匹配"Bob"中的"o" 但能匹配 "foooood"中的所有 o        "o{1,}" 等价于 "o+"            "o{0,}" 则等价于 "o*"
(str){ ,y}#只匹配重复0次到y次的str 例如  o{2,} 不能匹配"Bob"中的"o" 但能匹配 "foooood"中的所有 o        "o{1,}" 等价于 "o+"            "o{0,}" 则等价于 "o*"
(str){ x, y}#只匹配重复x到y次的str 贪婪模式
(str){ x, y}?#只匹配重复x到y次的str 非贪婪模式 或 str可有可无
a|b#匹配a或b

r'\w' #匹配一个字母数字及下划线 [A-Za-z0-9_] word:3rd-Person
r'\W'#匹配一个非字母数字及下划线 '[^A-Za-z0-9_]'
r'\s'#匹配一个任意空白字符 等价于  [ \f\n\r\t\v]
r'\S'#匹配一个任意非空字符 [^ \f\n\r\t\v]
r'\d'#匹配一个任意数字 等价于 [0-9].
r'\D'#匹配一个任意非数字 [^0-9]
r'\A'#类似^ 但不受re.M控制
r'\Z'#类似$ 但不受re.M控制
r'\z'#匹配一个字符串结束
r'\G'#匹配一个最后匹配完成的位置
'\b'#匹配一个单词边界 如 r'\bfoo\b' 匹配 'foo', 'foo.', '(foo)', 'bar foo baz' 但不匹配 'foobar' 或者 'foo3'
r'\B'#匹配非单词边界 如 r'py\B' 匹配 'python', 'py3', 'py2', 但不匹配 'py', 'py.', 或者 'py!'. \B 是 \b 的取非
'\n'#匹配一个换行符
'\t'#匹配一个制表符
'\1'-'\99'#第1-99个分组的内容 表达式自身也可以引用
re.compile(r'Agent (\w)\w*').sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a spy.')=='A**** told C**** that E**** knew B**** was a spy.'

[0-9]#匹配任何数字 类似于 [0123456789]
[a-z]   #匹配任何小写字母
[A-Z]#匹配任何大写字母
[a-zA-Z0-9]#匹配任何字母及数字
[^aeiou]#除了aeiou字母以外的所有字符
[^0-9]#匹配除了数字外的字符

r'\d(.*) are (.*?) .*'
r 表示忽略转义字符
(.*) 第一个匹配分组,.* 代表匹配除之外的所有长度的字符
(.*?) 第二个匹配分组,.*? 后面多个问号,代表非贪婪模式,只匹配符合条件的最少字符
re.compile(r'<.*?>').search('<To serve man> for dinner.>').group()=='<To serve man>'
re.compile(r'<.*>').search('<To serve man> for dinner.>').group()=='<To serve man> for dinner.>'

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

推荐阅读更多精彩内容