数据提取之re

正则表达式

在线测试网址:https://tool.oschina.net/regex/

一:匹配单个字符

  • 匹配某个字符
    
    
  • (.)匹配任意字符,但是--不匹配换行符[\n或\r\n]
    
  • \d 匹配任意的数字(0-9)
    
  • \D 匹配任意非数字
    
  • \s--小写--匹配空白字符(\n,\t,\r,和空格)
    
  • \S--大写--匹配任意的非空白字符
    
  • \w--小写--匹配a-z,A-Z,数字和下划线 [a-zA-Z0-9_]
    
  • \W--大写--匹配非字母数字下划线.等价于[^a-zA-Z0-9_]
    
  • []用来表示一组字符--匹配第一个满足任意正则表达式的字符
    相当于字符串中字符一个一个去匹配re,匹配上了就输出
    import re
    text="0746-123456789"
    ret=re.search('[\d-]',text)   #匹配结果为0,匹配一个满足的字符,后面的就不匹配了
    ret=re.search('[\-\d\d]',text)   #匹配结果为0
    print(ret.group())
    

二:匹配多个字符

  • *:匹配0或者任意多个字符
     text="0746-123456789"
     ret=re.search('\d*',text)   #匹配结果为0476
    
  • +:匹配1个或者多个    
    
  • ?:匹配0个或者1个--非贪婪
    
  • {m}:指定具体多少个
    text="0746-123456789"
    ret=re.search('\d{2}',text)   #匹配结果为07
    
  • {m,n}:匹配最少m个,最多n个---贪婪匹配
    

三:小案列

  • 验证手机号

    规则:以1开头,第二位可以是[34587],后面9位任意数字
    pattern='1[34587]\d{9}'
    
  • 验证邮箱

    规则:邮箱名称是用数字,字母,下划线组成,然后是@符号,后面是域名
    pattern='\w+@\w+\.[a-zA-Z\.]+'   
    注意:@前面至少要有1个,所以用+   转义\.   com或者com.cn--- 用[a-zA-Z\.]+任意字母和.
    
  • 验证URL

    规则:http或者http或fts等协议头,再加上:// ,然后任意非空白字符
     pattern='(http|https|ftp)://[^\s]+'
     pattern='[a-zA-Z]://[^\s]*'
    
  • 验证身份证

    规则:身份证共19位,前17位是数字,最后一位可以使小写x,大写X,数字
     pattern='\d{17}[xX\d]'
    

四:注意点

贪婪模式
.+   .*:匹配任意字符

非贪婪模式
.+?   .*?

^:以...开头
$:以...结尾

转义

五:re模块中的常用函数

  • re.match('pattern',str,修饰符):从开始的位置进行匹配,如果开始的位置没有匹配到,就返回None
  • match()函数适合用来做检测,判断某个字符串是否符合某个re规则
str='hello'
ret=re.match('h',str)
print(ret.group())  # 结果为h
#group()  会输出完成的匹配结果
#group(1)  会输出完整匹配中--用第1个()括起来的字符串



分组:使用()的方式
1:group()和group(0)是一样的,都是返回完整的匹配内容
2:groups() :返回的是里面的子组,索引从1开始
3:group(1)  :返回的第一个子组,同上
        
str="apple's price is $10,pink's price is $11"
pattern='.*(\$\d+).*(\$\d+)'
ret=re.match(pattern,str)
print(ret.group())    #   apple's price is $10,pink's price is $11
print(ret.groups())   #   ('$10', '$11')
print(ret.group(1))	  #   $10
print(ret.group(1,2))  #  ('$10', '$11')

修饰符号:
    re.I     使匹配对大小写不敏感
    re.S     使.匹配包括换行符在内的所有内容
    
pattern='.*(\$\d+).*(\$\d+)'
ret=re.match(pattern,str,re.S)
  • re.search():会扫描整个字符串,然后返回 第一个成功匹配的结果,如果扫描完了没匹配上,就返回None

  • re.findall():匹配满足正则表达式的所有内容,返回一个列表

    遍历依次来获取每组内容

  • re.sub(pattern,“要替换的字符串”, 原字符串 )

    html=re.sub('<a.*?>|</a>',"",html)   #使用sub()方法将a节点去掉
    
    
  • re.split():使用正则表达式来分割字符串

    str="hello world i love you"
    ret=re.split('\W',str)
    print(ret)     # ['hello', 'world', 'i', 'love', 'you']
    
    str="hello&world i love you"
    ret=re.split(' |&',str)  
    print(ret)     #  ['hello', 'world', 'i', 'love', 'you']
    
    ret=re.split('^[a-zA-Z]',str)
    
  • re.compile():将常用 正则字符串,编译成 正则表达式对象,以便在后面复用

posted @ 2020-02-26 22:29  Noob52037  阅读(305)  评论(0编辑  收藏  举报