Python核心编程——第1章 正则表达式 笔记+问题

本文是关于Python核心编程中第1章正则表达式的深入笔记,探讨了如何限定仅包含'x'和'y'的两字母字符串。通过实例验证和相关知识点的阐述,解释了一个特定正则表达式为何只能匹配'xy'或'yx'。内容包括正则表达式的基础知识,bool类型的判断,以及(?:)和(?)在匹配过程中的作用。
摘要由CSDN通过智能技术生成

Python核心编程——第1章 正则表达式 笔记+问题

笔记部分

总结得比较好的Python核心编程——第1章 正则表达式 by RealEmperor

问题部分

问题

假定我们拥有另一个特殊字符,它仅 仅包含字母“x”和“y”,我们此时仅仅想要这样限定字符串:两字母的字符串必须由一 个字母跟着另一个字母。换句话说,你不能同时拥有两个相同的字母;要么由“x”跟着“y”,要么相反。

>>> bool(re.search(r'(?:(x)|y)(?(1)y|x)', 'xy'))  #True
>>> bool(re.search(r'(?:(x)|y)(?(1)y|x)', 'xx'))  #False

为什么上述的正则能且仅能匹配‘xy’或‘yx’ ?

相关知识

正则表达式:

表 示 法描述
(…)匹配封闭的正则表达式,然后另存为子组
(?:…)表示一个匹配不用保存的分组(功能与(…)类似,但分组不同)
((?id/name)Y|N)如果分组所提供的id或name(名称)存在,就返回正则表达式的条件匹配Y,如果不存在就返回N;|N是可选项

bool类型判断:

类型True or False 判定
NoneFalse
任意数值类型0,如:0,0.0,0j.False
任意空序列,如:’’, (), [].False
任意空字典mapping,如:{}False
用户自定义类中,定义了 _bool_() 或 _len_()返回0或FalseFalse
其他True

实例验证

?:的作用域,整个括号里面的

>>> bool(re.search(r'(?:y|(x))(?(1)y|x)', test_str))  #True,当test_str等于‘xy’或'yx'
>>> bool(re.search(r'(?:(x)|y)(?(1)y|x)', test_str))  #False,当test_str 不等于'xy' 且不等于'yx'

()的编号顺序

>>> re.search('(a|(b))','ba').groups() # ('b', 'b') , 第一个b指的是外层匹配的((b)),第二个b指的是内层的(b)
>>> re.search('(?:a|(b))','ba').groups() # ('b',), 最外层的分组没有保留
>>> re.search('(?:a|(b))','ab').groups() # (None,), 匹配到了a,但是分组结果不保留,bool(re.search('(?:a|(b))','ab'))结果为True
>>> re.search('(a|(b))','ab').groups() # ('a', None) ,匹配了第一个a,(b)不再匹配,因此为None
>>> re.search('(a(b(c)))','abc').groups() # ('a', 'bc', 'c') ,匹配的序号按左括号出现的顺序
>>> re.search('a|(b)','ab').groups() #

解释 bool(re.search(r’(?:y|(x))(?(1)y|x)’, test_str))

  • 输入test_str=‘xy’,(?:y|(x))匹配x,保留分组(x, ),?(1)为True,选择匹配y, 匹配
  • 输入test_str=‘yx’ ,(?:y|(x))匹配y,不保留分组, ?(1)为False,选择匹配x,匹配
  • 输入test_str=‘xx’, (?:y|(x))匹配x,保留分组(x, ),?(1)为True,选择匹配y, 不匹配
  • 输入test_str=‘yy’, (?:y|(x))匹配y,不保留分组,?(1)为False,选择匹配x, 不匹配

总结

之所以不理解,一个是概念不清晰,(…)分组的概念,(?:…)匹配不保留分组, 以及python的bool函数的返回值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值