#findal" />

m开头表示好的单词 python正则表达式

您所在的位置:网站首页 s开头的常用汉字 m开头表示好的单词 python正则表达式

m开头表示好的单词 python正则表达式

2023-03-29 17:32| 来源: 网络整理| 查看: 265

m开头表示好的单词 python正则表达式

发表于:2023-02-23

import re s = ''' 我的邮箱 [email protected] 则等待 [email protected] ''' "prism language-python"># findall 2个参数 第一个: 正则表达式 第二个:被查找文本 re.findall

"prism language-python">re.findall('a','ajdjajadja') ['a', 'a', 'a', 'a'] "prism language-python">re.findall('ab','abjdjadbajaadja') ['ab'] "prism language-python">re.findall('好','abjd你在就好了jadbajaadja') ['好'] "prism language-python">re.findall('好|了','abjd你在就好了jadbajaadja') ['好', '了'] "prism language-python">re.findall('张.丰',"张三丰,张四丰,张五丰") ['张三丰', '张四丰', '张五丰'] "prism language-python">re.findall('张..',"张三丰,张四丰,张五丰") ['张三丰', '张四丰', '张五丰'] "prism language-python">re.findall('张..',"张\n丰,张四丰,张五丰") ['张四丰', '张五丰'] "prism language-python">re.findall('[aeiou]',"How are you!") ['o', 'a', 'e', 'o', 'u'] 任意一个数字 re.findall('[0-9]',"1998") ['1', '9', '9', '8'] [_#0-9a-z] 单个字符写在前面 区间写在后面 "prism language-python">re.findall('[_#0-9a-z]',"port#18") ['p', 'o', 'r', 't', '#', '1', '8'] [^#0-9a-z] 表示除了 [#0-9a-z] 之外的 "prism language-python">re.findall('[^_#0-9a-z]',"Port-18") ['P', '-'] ^Hello 表示以Hello 开始 "prism language-python">re.findall('^Hello',"Hello,ajd") ['Hello'] Hello$ 以Hello 结尾 "prism language-python">re.findall('Hello$',"kakdm,Hello") ['Hello'] ^Hello$ 只匹配 Hello "prism language-python">re.findall('^Hello$',"Hello") ['Hello'] wo* o* 表示 o出现0次或者多次 "prism language-python">re.findall('wo*',"wooooo~~w!") ['wooooo', 'w'] 小练习

How are you? 提取 单词 结果 [‘How’,‘are’,‘you’]

"prism language-python">re.findall('[a-zA-Z]*',"How are you?") ['How', '', 'are', '', 'you', '', '']

I’m 18 提取 数字 结果 [‘18’]

"prism language-python">re.findall('[0-9]*',"I'm 18") ['', '', '', '', '18', '']

How are you? 提取 以大写字母开头的字符 结果 [‘How’]

"prism language-python">re.findall('[A-Z][a-zA-Z]*',"How are you? Fine jj MM") ['How', 'Fine', 'MM'] [A-Z][a-z]+ 以[A-Z]开头 并且 [a-z] 至少出现一次 "prism language-python">re.findall('[A-Z][a-z]+',"Hello World H") ['Hello', 'World'] -? -至少出现0次或1次 "prism language-python">re.findall('-?[0-9]+',"Jame,age:18, -26") ['18', '-26'] "prism language-python">re.findall('ab?',"adjj2asjdj12abksd2ja") ['a', 'a', 'ab', 'a'] "prism language-python">re.findall('-?[0-9]+',"167 -28 29 -8") ['167', '-28', '29', '-8'] [^ ]+ 除了空格以外的字符 出现至少一次以上 "prism language-python">re.findall('[^ ]+',"Port-9 Error #404# %@STD") ['Port-9', 'Error', '#404#', '%@STD'] 138[0-9]{8} [0-9]{8} 出现8次 多一次不要少一次不行 "prism language-python">re.findall('138[0-9]{8}',"Jame:13886495728") ['13886495728'] "prism language-python">re.findall('[1-9][0-9]{5,10}',"Baron:1259296994") ['1259296994'] \d 等于[0-9] "prism language-python">re.findall('\d{1,5}',"Mysql: 3306, http:80") ['3306', '80'] \D 除了0-9以外的字符 "prism language-python">re.findall('\D+',"Mysql: 3306, http:80") ['Mysql: ', ', http:'] \w 普通字符指数字,字母,下划线,汉字。 "prism language-python">re.findall('\w+',"server_port = 8888") ['server_port', '8888'] "prism language-python">re.findall('\w+',"日本语(日本语/にほんご Nihongo") ['日本语', '日本语', 'にほんご', 'Nihongo'] \W 匹配非普通字符 "prism language-python">re.findall('\W+',"server_port = 8888") [' = '] \s 匹配空字符(空字符指 空格 \r \n \t \v \f 字符) "prism language-python">re.findall('\w+\s+\w+',"hello world") ['hello world'] \S 匹配非空字符 "prism language-python">re.findall('\w+\S+\w+',"hello world") ['hello', 'world'] "prism language-python">re.findall('\w+\S+[\w|#]+',"Port-9 Error #404# %@STD") ['Port-9', 'Error', '404#', 'STD'] \A 表示开头位置,\Z 表示结尾位置 "prism language-python">re.findall('\AHello',"Hello world") ['Hello'] "prism language-python">re.findall('world\Z',"Hello world") ['world'] \b 表示单词边界,\B 表示非单词边界

说明:单词边界指数字字母(汉字)下划线与其他字符的交界位置。

"prism language-python"> re.findall(r'\bis\b',"This is a test.") ['is'] "prism language-python"> re.findall(r'is\b',"This a test.") ['is'] 类别 元字符

匹配字符

. […] [^…] \d \D \w \W \s \S

匹配重复

* + ? {n} {m,n}

匹配位置

^ $ \A \Z \b \B

其他

| () \

小练习

匹配数字 12 -36 28 1.34 -3.8

"prism language-python">re.findall('-?\d+\.*\d*','12 -36 28 1.34 -3.8') ['12', '-36', '28', '1.34', '-3.8'] "prism language-python">re.findall('\\$\\d+','日薪:$100') ['$100'] "prism language-python">re.findall(r'\bis\b','This is a test') ['is']

贪婪模式: 默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。比如: * + ? {m,n}

非贪婪模式(懒惰模式): 让匹配重复的元字符尽可能少的向后匹配内容。

"prism language-python">re.findall(r'\(.+?\)',"(abcd)efgh(higk)") ['(abcd)', '(higk)'] "prism language-python">re.findall(r'\(.+\)',"(abcd)efgh(higk)") ['(abcd)efgh(higk)'] s = ''' 1982年,刘德华以甲级成绩从艺员训练班毕业后正式签约TVB [26] 。同年在喜剧《花艇小英雄》中饰演败家仔钱日添。12月,与叶德娴搭档主演时装警匪剧《猎鹰》,凭借卧底警察江大伟一角获得关注 [27] 。 1983年,主演金庸武侠剧《神雕侠侣》,在剧中饰演外貌俊俏、倜傥不羁的杨过 [28] ;该剧在香港播出后取得62点的收视纪录。同年,与黄日华、梁朝伟、苗侨伟、汤镇业组成“无线五虎将” [29] 。 1984年,与赵雅芝合作主演古装武侠剧《魔域桃源》,在剧中饰演资质出众、武功高强的傅青云 [30] 。同年,与梁朝伟共同主演金庸武侠剧《鹿鼎记》,在剧中饰演英明果断的康熙 [31] 。 ''' "prism language-python">[item [1:-1] for item in re.findall(r'《.+?》',s)] ['花艇小英雄', '猎鹰', '神雕侠侣', '魔域桃源', '鹿鼎记'] "prism language-python">[item [1:-1] for item in re.findall(r'\[.+?\]',s)] ['26', '27', '28', '29', '30', '31'] 练习1 匹配一个 .com邮箱格式字符串 "prism language-python">re.findall

练习2 匹配一个密码 8-12数字字母下划线构成 "prism language-python">re.findall(r'\w{8,12}',"屁屁,[email protected]_912932301_om 傻大姐") ['asdjjasd', 'c_912932301_'] 练习3 匹配一个数字 整数,数字,小数 分数1/2,百分数45% "prism language-python">re.findall(r'-?\d+\.?/?\d*%?',"12,35.5,1/2,40%,-4") ['12', '35.5', '1/2', '40%', '-4'] 练习4 匹配一段文字中以大写字母开头的单词,注意文字中可能有 iPython(不算) H-base(算) 单词可能有 大写字母小写字母 -_ "prism language-python">re.findall(r'\b[A-Z][a-zA-Z_-]*',"K_dkd,_ak,Akdk,iKasd_k,K-123 AAA") ['K_dkd', 'Akdk', 'K-', 'AAA'] "prism language-python">re.search(r'(ab)+',"ababababab").group() 'ababababab' "prism language-python">re.search(r'(王|李)\w{1,3}',"王者荣耀啊").group() '王者荣耀' "prism language-python">re.search(r'[王李]\w{1,3}',"王者荣耀啊").group() '王者荣耀' ?P是取个名字 pig (?Pab)+ == (ab)+ "prism language-python">re.search(r'(?Pab)+',"ababababab").group('pig') 'ab' 代码演示 """ regex1.py re模块 功能函数演示2 生成math对象的函数 """ import re pattern = '[^ ]+' s = '你在就好了 我发誓不在说谎了' l = re.findall(pattern, s) print(l) s = '今年是2019年,建国70周年' pattern = r'\d+' regex = re.compile(pattern) l = regex.findall(s) print(l) it = re.finditer(pattern, s) for item in it: print(item.group()) # 完成匹配一个字符串 m = re.fullmatch(r'.+', s) print(m) s = 'Alex:1994,Sunny:1996' # 按照正则表达式匹配内容切割字符串 l = re.split(r'[:,]', s) print(l) # 替换目标字符串 s1 = re.sub(r'[:,]', '-', s) print(s1) # Alex-1994-Sunny-1996 s1 = re.subn(r'[:,]', '-', s) print(s1) # ('Alex-1994-Sunny-1996', 3) s = '今年是2019年,建国70周年' # 以什么开头 print(re.match(r'\w+?', s)) s = '今年是2019年,建国70周年' # 只匹配一处 print(re.search(r'\d+', s)) regex = re.compile(r'(ab)cd(?Pef)') print(regex.flags) print(regex.pattern) print(regex.groupindex) print(regex.groups) pattern = r'(ab)cd(?Pef)' regex = re.compile(pattern) obj = regex.search('abcdefghi') # 属性变量 print(obj) # 目标字符串开始位置 print(obj.pos) # 目标字符串结束位置 print(obj.endpos) # 正则表达式 print(obj.re) # 目标字符串 print(obj.string) # 最后 一组的组名 print(obj.lastgroup) # 最后一组的序列号 print(obj.lastindex) # 属性方法 # 匹配到的内容 位置 print(obj.span()) # 匹配到内容的 起始位置 print(obj.start()) # 匹配到内容的 结束位置 print(obj.end()) # 捕获组字典 print(obj.groupdict()) # 子组对应元组 print(obj.groups()) # 获取match 对象对应内容 printobj.group(1)) print(obj.group(2)) print(obj.group('pig')) 常用

动机

文本处理已经成为计算机常见工作之一

对文本内容的搜索,定位,提取是逻辑比较复杂的工作

为了快速方便的解决上述问题,产生了正则表达式技术

简介

定义

即文本的高级匹配模式,提供搜索,替换等功能。其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式。

原理

通过普通字符和有特定含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等,来表达某类特定的字符串,进而匹配。

目标

熟练掌握正则表达式元字符

能够读懂常用正则表达式,编辑简单的正则规则

能够熟练使用re模块操作正则表达式

元字符使用 普通字符

匹配规则:每个普通字符匹配其对应的字符

e.g. In : re.findall('ab',"abcdefabcd") Out: ['ab', 'ab']

注意事项:正则表达式在python中也可以匹配中文

或关系

元字符: |

匹配规则: 匹配 | 两侧任意的正则表达式即可

e.g. In : re.findall Out: ['com', 'cn'] 匹配单个字符

元字符: .

匹配规则:匹配除换行外的任意一个字符

e.g. In : re.findall('张.丰',"张三丰,张四丰,张五丰") Out: ['张三丰', '张四丰', '张五丰'] 匹配字符集

元字符: [字符集]

匹配规则: 匹配字符集中的任意一个字符

表达形式:

[abc#!好] 表示 [] 中的任意一个字符 [0-9],[a-z],[A-Z] 表示区间内的任意一个字符 [_#?0-9a-z] 混合书写,一般区间表达写在后面

e.g. In : re.findall('[aeiou]',"How are you!") Out: ['o', 'a', 'e', 'o', 'u'] 匹配字符集反集

元字符:[^字符集]

匹配规则:匹配除了字符集以外的任意一个字符

e.g. In : re.findall('[^0-9]',"Use 007 port") Out: ['U', 's', 'e', ' ', ' ', 'p', 'o', 'r', 't'] 匹配字符串开始位置

元字符: ^

匹配规则:匹配目标字符串的开头位置

e.g. In : re.findall('^Jame',"Jame,hello") Out: ['Jame'] 匹配字符串的结束位置

元字符: $

匹配规则: 匹配目标字符串的结尾位置

e.g. In : re.findall('Jame$',"Hi,Jame") Out: ['Jame']

规则技巧: ^ 和 $必然出现在正则表达式的开头和结尾处。如果两者同时出现,则中间的部分必须匹配整个目标字符串的全部内容。

匹配字符重复

元字符: *

匹配规则:匹配前面的字符出现0次或多次

e.g. In : re.findall('wo*',"wooooo~~w!") Out: ['wooooo', 'w']

元字符:+

匹配规则: 匹配前面的字符出现1次或多次

e.g. In : re.findall('[A-Z][a-z]+',"Hello World") Out: ['Hello', 'World']

元字符:?

匹配规则: 匹配前面的字符出现0次或1次

e.g. 匹配整数 In [28]: re.findall('-?[0-9]+',"Jame,age:18, -26") Out[28]: ['18', '-26']

元字符:{n}

匹配规则: 匹配前面的字符出现n次

e.g. 匹配手机号码 In : re.findall('1[0-9]{10}',"Jame:13886495728") Out: ['13886495728']

元字符:{m,n}

匹配规则: 匹配前面的字符出现m-n次

e.g. 匹配qq号 In : re.findall('[1-9][0-9]{5,10}',"Baron:1259296994") Out: ['1259296994'] 匹配任意(非)数字字符

元字符: \d \D

匹配规则:\d 匹配任意数字字符,\D 匹配任意非数字字符

e.g. 匹配端口 In : re.findall('\d{1,5}',"Mysql: 3306, http:80") Out: ['3306', '80'] 匹配任意(非)普通字符

元字符: \w \W

匹配规则: \w 匹配普通字符,\W 匹配非普通字符

说明: 普通字符指数字,字母,下划线,汉字。

e.g. In : re.findall('\w+',"server_port = 8888") Out: ['server_port', '8888'] 匹配任意(非)空字符

元字符: \s \S

匹配规则: \s 匹配空字符,\S 匹配非空字符

说明:空字符指 空格 \r \n \t \v \f 字符

e.g. In : re.findall('\w+\s+\w+',"hello world") Out: ['hello world'] 匹配开头结尾位置

元字符: \A \Z

匹配规则: \A 表示开头位置,\Z 表示结尾位置

匹配(非)单词的边界位置

元字符: \b \B

匹配规则: \b 表示单词边界,\B 表示非单词边界

说明:单词边界指数字字母(汉字)下划线与其他字符的交界位置。

e.g. In : re.findall(r'\bis\b',"This is a test.") Out: ['is'] 类别 元字符

匹配字符

. […] [^…] \d \D \w \W \s \S

匹配重复

* + ? {n} {m,n}

匹配位置

^ $ \A \Z \b \B

其他

| () \

正则表达式的转义

如果使用正则表达式匹配特殊字符则需要加 \ 表示转义。

特殊字符: . * + ? ^ $ [] () {} | \

e.g. 匹配特殊字符 . 时使用 \. 表示本身含义 In : re.findall('-?\d+\.?\d*',"123,-123,1.23,-1.23") Out: ['123', '-123', '1.23', '-1.23']

在编程语言中,常使用原生字符串书写正则表达式避免多重转义的麻烦。

e.g. python字符串 --> 正则 --> 目标字符串 "\\$\\d+" 解析为 \$\d+ 匹配 "$100" "\\$\\d+" 等同于 r"\$\d+" 贪婪模式和非贪婪模式

定义

贪婪模式: 默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。比如: * + ? {m,n}

非贪婪模式(懒惰模式): 让匹配重复的元字符尽可能少的向后匹配内容。

贪婪模式转换为非贪婪模式

在匹配重复元字符后加 ‘?’ 号即可

* : *? + : +? ? : ?? {m,n} : {m,n}? e.g. In : re.findall(r'\(.+?\)',"(abcd)efgh(higk)") Out: ['(abcd)', '(higk)'] 正则表达式分组

定义

在正则表达式中,以()建立正则表达式的内部分组,子组是正则表达式的一部分,可以作为内部整体操作对象。

作用

可以被作为整体操作,改变元字符的操作对象

e.g. 改变 +号 重复的对象 In : re.search(r'(ab)+',"ababababab").group() Out: 'ababababab' e.g. 改变 |号 操作对象 In : re.search(r'(王|李)\w{1,3}',"王者荣耀").group() Out: '王者荣耀'

可以通过编程语言某些接口获取匹配内容中,子组对应的内容部分

e.g. 获取url协议类型

捕获组

可以给正则表达式的子组起一个名字,表达该子组的意义。这种有名称的子组即为捕获组。

格式:(?Ppattern)

e.g. 给子组命名为 "pig" In : re.search(r'(?Pab)+',"ababababab").group('pig') Out: 'ab'

注意事项

一个正则表达式中可以包含多个子组

子组可以嵌套,但是不要重叠或者嵌套结构复杂

子组序列号一般从外到内,从左到右计数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1hcduiI-1639846708075)(img/re.png)]

正则表达式匹配原则

正确性,能够正确的匹配出目标字符串.

排他性,除了目标字符串之外尽可能少的匹配其他内容.

全面性,尽可能考虑到目标字符串的所有情况,不遗漏.

Python re模块使用

参考代码day13/regex.py

"prism language-python"> regex = compile(pattern,flags = 0) 功能: 生产正则表达式对象 参数: pattern 正则表达式 flags 功能标志位,扩展正则表达式的匹配 返回值: 正则表达式对象 "prism language-python"> re.findall(pattern,string,flags = 0) 功能: 根据正则表达式匹配目标字符串内容 参数: pattern 正则表达式 string 目标字符串 flags 功能标志位,扩展正则表达式的匹配 返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容 "prism language-python"> regex.findall(string,pos,endpos) 功能: 根据正则表达式匹配目标字符串内容 参数: string 目标字符串 pos 截取目标字符串的开始匹配位置 endpos 截取目标字符串的结束匹配位置 返回值: 匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容 "prism language-python">re.split(pattern,string,flags = 0) 功能: 使用正则表达式匹配内容,切割目标字符串 参数: pattern 正则表达式 string 目标字符串 flags 功能标志位,扩展正则表达式的匹配 返回值: 切割后的内容列表 "prism language-python"> re.sub(pattern,replace,string,max,flags = 0) 功能: 使用一个字符串替换正则表达式匹配到的内容 参数: pattern 正则表达式 replace 替换的字符串 string 目标字符串 max 最多替换几处,默认替换全部 flags 功能标志位,扩展正则表达式的匹配 返回值: 替换后的字符串 "prism language-python"> re.subn(pattern,replace,string,max,flags = 0) 功能: 使用一个字符串替换正则表达式匹配到的内容 参数: pattern 正则表达式 replace 替换的字符串 string 目标字符串 max 最多替换几处,默认替换全部 flags 功能标志位,扩展正则表达式的匹配 返回值: 替换后的字符串和替换了几处

参考代码day13/regex1.py

"prism language-python"> re.finditer(pattern,string,flags = 0) 功能: 根据正则表达式匹配目标字符串内容 参数: pattern 正则表达式 string 目标字符串 flags 功能标志位,扩展正则表达式的匹配 返回值: 匹配结果的迭代器 "prism language-python">re.fullmatch(pattern,string,flags=0) 功能:完全匹配某个目标字符串 参数:pattern 正则 string 目标字符串 返回值:匹配内容match object "prism language-python">re.match(pattern,string,flags=0) 功能:匹配某个目标字符串开始位置 参数:pattern 正则 string 目标字符串 返回值:匹配内容match object "prism language-python">re.search(pattern,string,flags=0) 功能:匹配目标字符串第一个符合内容 参数:pattern 正则 string 目标字符串 返回值:匹配内容match object

compile对象属性

【1】 pattern : 正则表达式 【2】 groups : 子组数量 【3】 groupindex : 捕获组名与组序号的字典 match对象的属性方法

参考代码day13/regex2.py

属性变量

pos 匹配的目标字符串开始位置

endpos 匹配的目标字符串结束位置

re 正则表达式

string 目标字符串

lastgroup 最后一组的名称

lastindex 最后一组的序号

属性方法

span() 获取匹配内容的起止位置

start() 获取匹配内容的开始位置

end() 获取匹配内容的结束位置

groupdict() 获取捕获组字典,组名为键,对应内容为值

groups() 获取子组对应内容

group(n = 0)

功能:获取match对象匹配内容 参数:默认为0表示获取整个match对象内容,如果是序列号或者组名则表示获取对应子组内容 返回值:匹配字符串

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PTzV6uvB-1639846708075)(img/re1.png)]

flags参数扩展

参考代码day13/flags.py

使用函数:re模块调用的匹配函数。如:re.compile,re.findall,re.search…

作用:扩展丰富正则表达式的匹配功能

常用flag

A == ASCII 元字符只能匹配ascii码

I == IGNORECASE 匹配忽略字母大小写

S == DOTALL 使 . 可以匹配换行

M == MULTILINE 使 ^ $可以匹配每一行的开头结尾位置

使用多个flag

方法:使用按位或连接 e.g. : flags = re.I | re.A

综合练习 """ 终端输入一个 端口名称 返回一个地址 """ import re list_ = [] flag = False def get_port(port): f = open('exc.txt') while True: # 获取一段内容 data = '' for line in f: # 这里 line 会一直继续下去 是因为 f.read 后 seek的值一直在往后移动 if line == '\n': break data += line # data 为空说明到哦文件结尾 if not data: break obj = re.match(port, data) if obj: #Hardware is TenGigE, address is 10f3.114b.9779 (bia 10f3.114b.9779) # g = re.search(r'\d+\.\d+\.\d+\.\d+/\d+', data) g = re.search(r'(\d{1,3}\.){3}\d{1,3}/\d+|Unknown', data) # g = re.search(r'([0-9a-f]{4}\.){2}[0-9a-f]{4}', data) if g: return g.group() return '没有找到端口' print('没有找到端口') if __name__ == '__main__': port = 'TenGigE0' print(get_port(port))


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3