博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day21 re模块
阅读量:6820 次
发布时间:2019-06-26

本文共 3999 字,大约阅读时间需要 13 分钟。

引入方式
1 import re

方法   .findall()            找所有的,返回所有的结果然后放在列表中 
1 ret = re.findall("[a-z]+","yangtuo tiancan shiye ")2 print(ret) # ['yangtuo', 'tiancan', 'shiye']
  .finditer()           返回一个迭代器 ,更节省内存,一次一次返回
1 ret = re.finditer("\d","dahka5hdka4546465h")2 print(ret)                      # 
3 print(next(ret).group()) # 54 print(next(ret).group()) # 45 print([i.group() for i in ret]) # ['5', '4', '6', '4', '6', '5']
  .search()           从前往后找到一个就返回一个对象,调用group才可以拿到结果
1 ret = re.search("a","yangtuo is tiancai")2 print(ret.group())    # a
        找不到返回None,无法调用group,会报错
1 ret = re.search("[0-9]+","yangtuo is tiancai")2 print(ret)            # None3 print(ret.group())    # AttributeError: 'NoneType' object has no attribute 'group'
        为了避免上面的这种报错,可以利用if判断,从而打断if循环不报错,非常常用的方式
1 ret = re.search("j","yangtuo is tiancai")2 if ret:3     print(ret.group())  # 无结果但是不会报错了
     .match()         必须从头开始匹配,比如下面的字符串,y,ya都能匹配上。但是a就不行       用法和search一样,返回对象,必须用group输出,空报错,可if避免
1 ret = re.match("[a-z]+","yangtuo is tiancai")2 print(ret.group())    # yangtuo3 ret = re.match("a","yangtuo is tiancai")4 print(ret.group())    # AttributeError: 'NoneType' object has no attribute 'group'
      .split()       按照正则关系分割,不是很常用
1 ret = re.split("[ab]","abcd")2 # 先按a分割得到 " " 和"bcd",再按b分割得到 " "," ","cd"3 print(ret) # ['', '', 'cd']
       .sub()       按照正则对字符串替换       将数字替换成H 替换两次
1 ret = re.sub("\d","H","shah4546shdah123",2)2 print(ret) # shahHH46shdah123
       .subn()       按照正则对字符串替换,并且返回结果和替换了几次用元祖形式       将数字替换成H 替换两次
1 ret = re.subn("\d","H","shah4546shdah123",2)2 print(ret) # ('shahHH46shdah123', 2)
       .compile()         同一个正则规则需要被用很多次的时候可以使用此命令重复调用         将正则表达式编译成一个对象,调用对象使用更简单
1 obj = re.compile("\d{3}")2 ret = obj.search("hsdhabsh153lhslk86")3 ret1 = obj.search("hsdh46897=lhslk86")4 print(ret.group())    # 1535 print(ret1.group())    # 468

特殊场景分析    findall的优先级查询
1 import re    2 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')3 print(ret)     # ['oldboy']4 # 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配真实想要的结果,取消权限即可 5 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')6 print(ret) # ['www.oldboy.com']
   split的优先级查询     在匹配部分加上()之后所切出的结果是不同的,     没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项,     这个在某些需要保留匹配部分的使用过程是非常重要的。
1 ret=re.split("\d+","eva3egon4yuan")2 print(ret) # ['eva', 'egon', 'yuan']3 ret=re.split("(\d+)","eva3egon4yuan")4 print(ret) # ['eva', '3', 'egon', '4', 'yuan']  
  分组的命名和引用     组名的方式命名(?P
<组名>
)     组名的引用(?P=组名)
1 ret = re.search("<(?P
\w+)>\w+
","

hello

")2 print(ret.group("tag_name"))   # h13 print(ret.group()) #

hello

    也可以直接分组,然后用\1引用第一个组,组的索引是从1开始不是从0开始
1 ret = re.search(r"<(\w+)>\w+
","

hello

")2 print(ret.group(1)) # h13 print(ret.group()) #

hello

 

匹配小数整数
1 # 40.35被当做40和35两个来取了2 ret=re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))")3 print(ret) #['1', '2', '60', '40', '35', '5', '4', '3']
  利用|的工作原理从左到右最长匹配,将长的匹配项先写就可以   注意将 . 进行转义 \.   可以分组将分组的内容优先显示,但是无匹配的选项会用空表示出来,很蛋疼   可以使用remove进行空选项的移除 顺便这次稍微升级一下吧负号一起取到了
1 ret=re.findall(r"-?\d+\.\d*|(-?\d+)","1-2*(60+(-40.35/5)-(-4*3))")2 print(ret) #['1', '-2', '60', '', '5', '-4', '3']3 ret.remove("")4 print(ret) #['1', '-2', '60', '5', '-4', '3']

示例:      获取手机号匹配方式对比      普通的方式实现
1 while True: 2     phone_number = input('please input your phone number : ') 3     if len(phone_number) == 11 \ 4             and phone_number.isdigit()\ 5             and (phone_number.startswith('13') \ 6             or phone_number.startswith('14') \ 7             or phone_number.startswith('15') \ 8             or phone_number.startswith('18')): 9         print('是合法的手机号码')10     else:11         print('不是合法的手机号码')
  re 实现
1 # 正则实例2 import re3 phone_number = input('please input your phone number : ')4 if re.match('^(13|14|15|18)[0-9]{9}$',phone_number):5         print('是合法的手机号码')6 else:7         print('不是合法的手机号码')

 

 

转载于:https://www.cnblogs.com/shijieli/p/9713783.html

你可能感兴趣的文章