re正则表达式

一、常用的匹配规则

在线正则表达式测试工具https://tool.oschina.net/regex/?optionGlobl=global#,输入待匹配的文本, 然后选择常用的正则表达式,就可以得相应的匹配结果了。

在这里插入图片描述

二、python正则库re及方法

1.match()

**介绍:**从字符串的起始位置开始匹配;在match ()方法中,第一个参数传入了正则表达式:pattern,第二个参数传入了要匹配的字符串:string。

函数:re.match(pattern,string)得到的结果是到结果是SRE_Match 对象。该对象有两种方法:

  • re.match().group():正则表达式规则所匹配的内容;
  • re.match().span():输出匹配的范围

**目标匹配:**使用()括号将想提取的子字符串括起来,()实际上标记了一个子表达式的开始和结束位置,被标记的每个子表达式会依次对应每一个分组,调用group ()方法传入分组的索引即可获取提取的结果。

connent = 'hello 123 4557 world_This is phone'
result = re.match('^hello\s(\d+)\s(\d+)\s\w{10}',connent)
print(result.group(1))

通用匹配:.*;将中间部分直接省略,全部用. *来代替,最后加一个结尾字符串

connent = 'hello 123 4557 world_This is phone'
#result1 = re.match('.*',connent)
#result1 = re.match('hello.*is',connent)
result1 = re.match('hello.*phone$',connent)
print(result1)
print(result1.group())
print(result1.span())

贪婪与非贪婪:

  • 贪婪: .*会匹配尽可能多的字符,有时候,匹配结果会莫名其妙少了一部分内容。
connent = 'hello 123 4557 world_This is phone'
result2 = re.match('hello.*(\d+).*phone$',connent)
print(result2)
print(result2.group(1))
print(result2.span())

结果只有7

  • 非贪婪:.*?尽可能匹配少的字符
connent = 'hello 123 4557 world_This is phone'
result2 = re.match('hello.*?(\d+).*phone$',connent)
print(result2)
print(result2.group(1))
print(result2.span())

结果是:123

所以说,在做匹配的时候,字符串中间尽量使用非贪婪匹配,也就是用.*?叫来代替.*,以免出现匹配结果缺失的情况。

**注意:**如果匹配的结果在字符串结尾.*?就有可能匹配不到任何内容了,因为它会匹配尽可能少的字符。

修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。如换行符
注意:.匹配的是除换行符之外的任意字符;当遇到换行符时,.*?的就不能匹配了,所以导致匹配失败。这里只需加一个修饰符re.S ,即可修正这个错误:

connent1 = 'hello 123 4557 world_This ' \
           'is phone'
result3 = re.match('hello.*?(\d+).*phone$',connent1,re.S)
print(result3)
print(result3.group(1))
print(result3.span())

re.S 在网页匹配中经常用到。因为HTML 节点经常会有换行,加上它,就可以匹配节点与节点之间的换行了。

在这里插入图片描述
转义匹配
我们知道正则表达式定义了许多匹配模式,如. 匹配除换行符以外的任意字符,但是如果目标字符串里面就包含.,那该怎么办呢?这里就需要用到转义匹配了。
当遇到用于正则匹配模式的特殊字符时,在前面加反斜线转义一下即可。例如.就可以用.来匹配。

connent2 = 'hello.1234557 world_This ' \
           'is phone'
result4 = re.match('hello\.*?(\d+).*phone$',connent2,re.S)
print(result4)
print(result4.group(1))
print(result4.span())


connent2 = 'hello.1234557*world_This ' \
           'is phone'
result4 = re.match('hello\.*?(\d+)\*',connent2,re.S)
print(result4)
print(result4.group(1))
print(result4.span())


2.search()

match ()方法是从字符串的开头开始匹配的,search ()它在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果。也就是说,正则表达式可以是字符串的一部分,在匹配时, search ()方法会依次扫描字符串,直到找到第一个符合规则的字符串,然后返回匹配内容,如果搜索完了还没有找到,就返回None 。
在这里插入图片描述
尝试提取class 为active 的li 节点内部的超链接包含的歌手名和歌名,此时需要提
取第三个li 节点下a 节点的singer 属性和文本。
在这里插入图片描述
在这里插入图片描述

3.findall()

search ()方法的用法,它可以返回匹配正则表达式的第一个内容,但是如果想要获取匹配正则表达式的所有内容,那该怎么办呢?这时就要借助findall ()方法了。

findall ()该方法会搜索整个字符串,然后返回匹配正则表达式的所有内容。还是上面的HTML 文本,如果想获取所有a 节点的超链接、歌手和歌名,就可以将search ()方法换成findall ()方法。如果有返回结果的话,就是列表类型,所以需要遍历一下来依次获取每组内容。代码如下:
在这里插入图片描述
在这里插入图片描述

4.sub()

可以修改文本内容,比如去掉一串文本中的数字。
在这里插入图片描述

5.compile()

前面所讲的方法都是用来处理字符串的方法,最后再介绍一下compile ()方法,这个方法可以将
正则字符串编译成正则表达式对象,以便在后面的匹配中复用。示例代码如下:
在这里插入图片描述
另外, compile ()还可以传入修饰符,例如re . S 等修饰符,这样在seach() 、findall() 等方法中就不需要额外传了。所以, compile ()方法可以说是给正则表达式做了一层封装,以使我们更好地复用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值