#findal" />
m开头表示好的单词 python正则表达式 |
您所在的位置:网站首页 › s开头的常用汉字 › m开头表示好的单词 python正则表达式 |
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 objectcompile对象属性 【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 |