网络分析法(2)-->> 正则表达式(2)对python的支持 match(),search()函数精讲

12 篇文章 0 订阅
3 篇文章 0 订阅


可参考 网络分析法 (2)-- >>正则表达式(1)极其详尽版

正则表达式对python的支持

  • 在其他编程语言中,处理正则表达式时,反斜杠“”时常带来想不到的造成困扰

    • 反斜杠既可作为普通字符,又兼任着转义字符的功能,假如你需要匹配文本中的字符“\”

    • 那么使用编程语言表示的正则表达式需要使用4个反斜杠“\\”:前两个和后两个分别用于在编程语言中转义成反斜杠,转换成两个反斜杠后,再在正则表达式中转义成一一个反斜杠。

    • 而在Python中,原生字符串很好地解决了这个问题,简单地使用r"“即可。同样,匹配一个数字的”\d"可以写成r"d"。使用原生字符串,无须担心繁杂的转义问题,写出来的表达式也更加直观。

  • Python中使用re模块来提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为Pattem实例,然后使用Pattern实例处理文本并获得匹配结果(一个 Match实例最后使用Match实例获得信息,进行其他的操作。

  • 普通字符 字⺟、数字、汉字、下划线、以及没有特殊定义的符号,都是"普通字符"。

    • 正则表达式中的普通字符,在匹配的时候,只匹配与⾃身相同的⼀个字符。

    • 例如:表达式c,在匹配字符串abcde时,匹配结果是:成功;匹配到的内容 是c;匹配到的位置开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语⾔的不同⽽可能不同)

match()函数

match(pattern, string, flags=0)

从字符串string起始位置开始匹配pattern,若匹配到,则返回一个match对象,若未匹配到,则返回None

  • 第⼀个参数是正则表达式,如果匹配成功,则返回⼀个match对象,否则返 回⼀个None
  • 第⼆个参数表示要匹配的字符串
  • 第三个参数是标致位⽤于控制正则表达式的匹配⽅式 如: 是否区分⼤⼩写,多 ⾏匹配等等
    例如:
import re

patten = 'python'
string = 'python and me'

req = re.match(patten,string)
if req:
    print(req)
else:
    print('对不起,没有匹配到')
<re.Match object; span=(0, 6), match='python'>
import re

patten = 'python'
string = 'me and python'

req = re.match(patten,string)
if req:
    print(req)
else:
    print('对不起,没有匹配到')
对不起,没有匹配到
compile与falges

re.compile(patterm,flags-0)

compile可以将字符串pattern 转化为Pattern对象,用来给其他的re函数提供正则表达式参数,做进一步归搜索,其中的flags是匹配模式,可选的有:

  • re.I:忽咯大小写。

  • re.M:多行模式, 改变"和$的行为。

  • re.S:点任意匹配模式,改变“.” 的行为。

  • re.L;使预定字符类\wW\bB’s\S取决于当前区域设定。

  • re.U:使预定字符类\w\W b\BslS)d\D取决于Unicode 定义的字符属性。

  • re,V;详细模式,这个模式下正则表达式可以是多行的, 忽略空白字符,并可以加入注释

分组功能

Python的re模块有⼀个分组功能。所谓的分组就是去已经匹配到的内容再筛选 出需要的内容,相当于⼆次过滤。实现分组靠圆括号(),⽽获取分组的内容靠的 是group()、groups(),re模块⾥的积个重要⽅法在 分组上,有不同的表现形式,需要区别对待

import re

patten = 'python'
string1 = 'python and me'
string2 = 'me and python'
req1 = re.match(patten,string1)
req2 = re.match(patten,string2)
if req1:
    # 返回匹配的所有结果
    print('groups():',req1.groups())
    # 匹配的内容
    print('group():',req1.group())
    # 返回未分组的原始匹配对象
    print('group(0)',req1.group(0))
    # group(1)返回第一组对象,依次类推
    # print('group(1):',req1.group(1))
    # 匹配的内容的开始位置
    print('start():',req1.start())
    # 匹配的内容的结束位置
    print('end():',req1.end())
    # 匹配的内容的位置
    print('span()',req1.span())

else:
    print('string1没有匹配到')

if req2:
    # 返回匹配的所有结果
    print('groups():',req2.groups())
    # 匹配的内容
    print('group():',req2.group())
    # 返回未分组的原始匹配对象
    print('group(0)',req2.group(0))
    # group(1)返回第一组对象,依次类推
    # print('group(1):',req2.group(1))
    # 匹配的内容的开始位置
    print('start():',req2.start())
    # 匹配的内容的结束位置
    print('end():',req2.end())
    # 匹配的内容的位置
    print('span()',req2.span())

else:
    print('string2没有匹配到')
groups(): ()
group(): python
group(0) python
start(): 0
end(): 6
span() (0, 6)
string2没有匹配到

re.search

re.search(pattern,string,flags=0)

Search万法与match方法类似,不同的是,match 必须在字符串起始位置开始匹配,而search观会查找整个string进行匹配。若在任意位置匹配到,则返回一个 Match对象,示例如下。

re search全文查找字符串

import re
#将正则表达式转化成Pattern对象
pattern = re.compile(r' (\d{4})-(\d{8})')
#待匹配字符串
string1 = "0755-44445555 is our new office phone number"

string2 = "the old number 0755-11112222 is no longer used"

#生成search对象

search1 = re.match(pattern, string1)

search2 = re.search(pattern, string2)
if search1:
    # re.search 结果类型
    print('search1返回结果类型为:',type(search1))
    # groups 返回所有匹配结果
    print ('search1 groups: ', search1 .groups())
    # group(0)为未分组的原始匹配对象
    print ('searchl group(0):',search1.group(0))
    #group(1)为第一组对象,以此类推
    print('searchl  group(l) :',search1.group(1))
    print ('searchl  group (2) :', search1.group(2))
else:
    print('search1 没有匹配到对象 ')
if search2:
    print('re.search2返回结果类型为:',type (search1))
    print('groups: ', search2.groups())
    print ('search2  group:', search2.group(0))
    print(' search2  group(l):', search2.group(1))
    print('search2  group (2) tjv9at/g:', search2.group(2))

else:
    print ('search2 没有匹配到')
searchl返回结果类型为: <class ' sre.SRE Match'>

search1 q: groups tjuay: ('0755', 44445555')

search1 group(0) j41G7: 0755-44445555

search1 ф group(1)1197/: 0755

search1 q group(2) HJPyGy: 44445555

search2返回结果类型为: <class ' sre.SRE Match'>

re.search返回结果类型为: ('0755'11112222')

search2 q groups fj1if73: 075511112222

search2 q group (0) fpi: 07551112222

search2 f group(2)J1434: 0755

search2 ф group(2) 1143: 11122222
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值