设为首页 收藏本站
查看: 1031|回复: 0

[经验分享] python学习-re模块

[复制链接]

尚未签到

发表于 2018-8-8 09:58:23 | 显示全部楼层 |阅读模式
  Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,在文本解析、复杂字符串分析和信息提取时是一个非常有用的工具,下面我主要总结了re的常用方法。
  1.re的简介
  使用python的re模块,尽管不能满足所有复杂的匹配情况,但足够在绝大多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息。python 会将正则表达式转化为字节码,利用 C 语言的匹配引擎进行深度优先的匹配。

  •   import re
  •   print re.__doc__
  可以查询re模块的功能信息,下面会结合几个例子说明。
语法意义说明&quot;.&quot;任意字符&quot;^&quot;字符串开始'^hello'匹配'helloworld'而不匹配'aaaahellobbb'&quot;$&quot;字符串结尾与上同理&quot;*&quot; 0 个或多个字符(贪婪匹配)<*>匹配<title>chinaunix</title>&quot;+&quot;1 个或多个字符(贪婪匹配)与上同理&quot;?&quot;0 个或多个字符(贪婪匹配)与上同理*?,+?,??以上三个取第一个匹配结果(非贪婪匹配)<*>匹配<title>{m,n}对于前一个字符重复m到n次,{m}亦可a{6}匹配6个a、a{2,4}匹配2到4个a{m,n}?对于前一个字符重复m到n次,并取尽可能少‘aaaaaa’中a{2,4}只会匹配2个&quot;\\&quot;特殊字符转义或者特殊序列[]表示一个字符集[0-9]、[a-z]、[A-Z]、[^0]&quot;|&quot;或A|B,或运算(...)匹配括号中任意表达式(?#...)注释,可忽略(?=...)Matches if ... matches next, but doesn't consume the string.'(?=test)'  在hellotest中匹配hello(?!...)Matches if ... doesn't match next.'(?!=test)'  若hello后面不为test,匹配hello(?<=...) Matches if preceded by ... (must be fixed length).'(?<=hello)test'  在hellotest中匹配test(?<!...)Matches if not preceded by ... (must be fixed length).'(?<!hello)test'  在hellotest中不匹配test  正则表达式特殊序列表如下:
特殊序列符号意义\A只在字符串开始进行匹配\Z只在字符串结尾进行匹配\b匹配位于开始或结尾的空字符串\B匹配不位于开始或结尾的空字符串\d相当于[0-9]\D相当于[^0-9]\s匹配任意空白字符:[\t\n\r\r\v]\S匹配任意非空白字符:[^\t\n\r\r\v]\w匹配任意数字和字母:[a-zA-Z0-9]\W匹配任意非数字和字母:[^a-zA-Z0-9]  3.re的主要功能函数
  1、compile()
  编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
  格式:
  re.compile(pattern,flags=0)
  pattern: 编译时用的表达式字符串。
  flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:
标志  含义
  re.S(DOTALL)
使.匹配包括换行在内的所有字符  re.I(IGNORECASE)
  使匹配对大小写不敏感
  re.L(LOCALE)
  做本地化识别(locale-aware)匹配,法语等
  re.M(MULTILINE)
  多行匹配,影响^和$
  re.X(VERBOSE)
  该标志通过给予更灵活的格式以便将正则表达式写得更易于理解
  re.U
  根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B
import re  
tt = &quot;Tina is a good girl, she is cool, clever, and so on...&quot;rr = re.compile(r'\w*oo\w*')print(rr.findall(tt))   #查找所有包含'oo'的单词执行结果如下:
  
['good', 'cool']
  2、match()
  决定RE是否在字符串刚开始的位置匹配。//注:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'
  格式:
  re.match(pattern, string, flags=0)
print(re.match('com','comwww.runcomoob').group())print(re.match('com','Comwww.runcomoob',re.I).group())  
执行结果如下:
  
com
  
com
  3、search()
  格式:
  re.search(pattern, string, flags=0)
  re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
print(re.search('\dcom','www.4comrunoob.5com').group())  
执行结果如下:
  
4com
  *注:match和search一旦匹配成功,就是一个match object对象,而match object对象有以下方法:

  •   group() 返回被 RE 匹配的字符串
  •   start() 返回匹配开始的位置
  •   end() 返回匹配结束的位置
  •   span() 返回一个元组包含匹配 (开始,结束) 的位置
  •   group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串。
  a. group()返回re整体匹配的字符串,
  b. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
  c.groups()groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
=  
(re.search(,a).group(0))
  
(re.search(,a).group(1))
  
(re.search(,a).group(2))
  
(re.search(,a).group(3))
  4、findall()
  re.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
  格式:
  re.findall(pattern, string, flags=0)
p = re.compile(r'\d+')print(p.findall('o1n2m3k4'))  
执行结果如下:
  
['1', '2', '3', '4']
import re  
tt = &quot;Tina is a good girl, she is cool, clever, and so on...&quot;rr = re.compile(r'\w*oo\w*')print(rr.findall(tt))print(re.findall(r'(\w)*oo(\w)',tt))#()表示子表达式 执行结果如下:
  
['good', 'cool']
  
[('g', 'd'), ('c', 'l')]
  5、finditer()
  搜索string,返回一个顺序访问每一个匹配结果(Match对象)的迭代器。找到 RE 匹配的所有子串,并把它们作为一个迭代器返回。
  格式:
  re.finditer(pattern, string, flags=0)
iter = re.finditer(r'\d+','12 drumm44ers drumming, 11 ... 10 ...')for i in iter:    print(i)    print(i.group())    print(i.span())  
执行结果如下:<_sre.SRE_Match object; span=(0, 2), match='12'>
  
12(0, 2)<_sre.SRE_Match object; span=(8, 10), match='44'>
  
44(8, 10)<_sre.SRE_Match object; span=(24, 26), match='11'>
  
11(24, 26)<_sre.SRE_Match object; span=(31, 33), match='10'>
  
10(31, 33)
  6、split()
  按照能够匹配的子串将string分割后返回列表。
  可以使用re.split来分割字符串,如:re.split(r'\s+', text);将字符串按空格分割成一个单词列表。
  格式:
  re.split(pattern, string[, maxsplit])
  maxsplit用于指定最大分割次数,不指定将全部分割。
print(re.split('\d+','one1two2three3four4five5'))  
执行结果如下:
  
['one', 'two', 'three', 'four', 'five', '']
  7、sub()
  使用re替换string中每一个匹配的子串后返回替换后的字符串。
  格式:
  re.sub(pattern, repl, string, count)
import re  
text = &quot;JGood is a handsome boy, he is cool, clever, and so on...&quot;print(re.sub(r'\s+', '-', text))
  
执行结果如下:
  
JGood-is-a-handsome-boy,-he-is-cool,-clever,-and-so-on...
  其中第二个函数是替换后的字符串;本例中为'-'
  第四个参数指替换个数。默认为0,表示每个匹配项都替换。
  re.sub还允许使用函数对匹配项的替换进行复杂的处理。
  如:re.sub(r'\s', lambda m: '[' + m.group(0) + ']', text, 0);将字符串中的空格' '替换为'[ ]'。
import re  
text = &quot;JGood is a handsome boy, he is cool, clever, and so on...&quot;print(re.sub(r'\s+', lambda m:'['+m.group(0)+']', text,0))
  
执行结果如下:
  
JGood[ ]is[ ]a[ ]handsome[ ]boy,[ ]he[ ]is[ ]cool,[ ]clever,[ ]and[ ]so[ ]on...
  8、subn()
  返回替换次数
  格式:
  subn(pattern, repl, string, count=0, flags=0)
print(re.subn('[1-2]','A','123456abcdef'))print(re.sub(&quot;g.t&quot;,&quot;have&quot;,'I get A,  I got B ,I gut C'))print(re.subn(&quot;g.t&quot;,&quot;have&quot;,'I get A,  I got B ,I gut C'))  
执行结果如下:
  
('AA3456abcdef', 2)
  
I have A,  I have B ,I have C
  
('I have A,  I have B ,I have C', 3)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548511-1-1.html 上篇帖子: python脚本的try语句 下篇帖子: 用 Python 发邮件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表