import re
# start(?=abc) 前向肯定界定符(又叫肯定式向前查找),匹配start字符序列后跟abc序列
# 对于向前查找,出现在指定项之后的字符序列不会被 正则表达式引擎 返回
ret = re.findall(r'start(?=abc)',"startabc123 jui")
print(ret) # ['start']
# start(?!abc) 前向否定界定符(否定式向前查找),匹配start字符序列后不跟abc字符序列
ret = re.findall(r"start(?!abc)","startjuicestartbbc")
print(ret) # ['start', 'start']
# (?<=Dr)Tian 肯定式向后查找,匹配前面有Dr的字符序列Tian
ret = re.findall(r"(?<=Dr)Tian","MrTian DrTian")
print(ret) # ['Tian']
# (?<!Mr\.)JiaYong 否定式向后查找 查找前面没有Mr.的JiaYong序列
ret = re.findall(r"(?<!Mr\.)JiaYong","Mr.JiaYong JiaYong")
print(ret) # ['JiaYong']
# 匹配整数
ret = re.findall(r"\d+","1-2*(60+(-40.35/5)-(-4*3))") # 这样去匹配的话,将小数 左右两边 的匹配出来了
print(ret) # ['1', '2', '60', '40', '35', '5', '4', '3']
# 这时候,就要利用findall 有分组捕获时,优先输出分组中的内容的特性了,以及 | 运算符 的特性了,这是短路 或
# 言下之意,或 左边的匹配了,就不用匹配的来匹配 右边的正则模式了
ret = re.findall(r'\d+\.\d+|\d+',"1-2*(60+(-40.35/5)-(-4*3))")
print(ret) # ['1', '2', '60', '40.35', '5', '4', '3'] 还没有达到最终效果,但现小数 ,单独匹配出来了
# 接收下利用findall,优先输出分组捕获的内容
ret = re.findall(r'\d+\.\d+|(\d+)',"1-2*(60+(-40.35/5)-(-4*3))")
print(ret) # ['1', '2', '60', '', '5', '4', '3']
ret.remove("")
print(ret) # ['1', '2', '60', '5', '4', '3']
test = re.findall(r"\d+|([a-z]+)","123abc123abci")
print(test) # ['', 'abc', '', 'abci'] 也就是说,在分组捕获时,当匹配123时,分组捕获空 字符串
# 如何让findall()函数,不优先输出分组捕获内容,答案是分组但不捕获,即未捕获组
test = re.findall(r"\d+|(?:[a-z]+)","123abc123abci")
print(test) # ['123', 'abc', '123', 'abci']
test = re.findall(r"\d+|[a-z]+","123abc123abci")
print(test) # ['123', 'abc', '123', 'abci'] 可见未捕获组,用不用,都像一样,但有些特殊情况下,必须要分组。
# for example
ret = re.findall(r"www\.(?:oldboy|baidu)\.com","www.baidu.com www.oldboy.com www.ccc.com")
print(ret) # ['www.baidu.com', 'www.oldboy.com']
# 以上如果不分组,就将 | 或运算 前面整体当一个模式,后面整体当一个模式,且或有短路特性,第一个匹配了,就不用第二个模式
ret = re.findall(r"www\.oldboy|baidu\.com","www.baidu.com www.oldboy.com www.ccc.com")
print(ret) # ['baidu.com', 'www.oldboy']
# 接下来,看看search()方法
# ret = re.search(r"\b[a-zA-Z]+\b","abc hello 123jiayong word love")
# print(ret) # <_sre.SRE_Match object; span=(0, 3), match='abc'> search 的结果是 一个 SRE_Match对象
# print(ret.group()) # abc search()返回第一个匹配的对象
# print(ret.group(0)) # abc
# print(ret.groups()) # () 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。
ret = re.search(r"(\b[a-zA-z]+\b)","abc hello 123jiayong word love")
print(ret.group(1))
print(ret.groups()) # ('abc',)
ret = re.search('(www)\.(baidu|oldboy)\.(com)',"www.baidu.com www.oldboy.com www.cc.com")
print(ret.group()) # www.baidu.com 匹配的整个表达式的字符串
print(ret.group(0)) # www.baidu.com
print(ret.group(1)) # www
print(ret.group(2)) # baidu
print(ret.group(3)) # com
print(ret.groups()) # ('www', 'baidu', 'com')
import sys
print(sys.version_info) #sys.version_info(major=3, minor=6, micro=3, releaselevel='final', serial=0)
result = "版本大于等于3.6" if sys.version_info >= (3,6) else " 版本小于3.6"
print(result) # 版本大于3.6
result = "版本大于等于3.7" if sys.version_info >= (3,7) else "版本小于3.7"
print(result) # 版本小于3.7
print( (2,3,5) >= (3,5)) # False 可见在python中,元组,也可以比较大小,以元素个数最少的元素且为将,
# 每个元素依次比较