笔记部分
总结得比较好的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 判定 |
---|---|
None | False |
任意数值类型0,如:0,0.0,0j. | False |
任意空序列,如:’’, (), []. | False |
任意空字典mapping,如:{} | False |
用户自定义类中,定义了 _bool_() 或 _len_()返回0或False | False |
其他 | 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函数的返回值。