分组在re模块中的使用

时间:2021-01-23 22:35:05
import re

#search
s = "<a>wahaha</a>"  #标签语言 html 和 web相关
ret= re.search("(>)(\w+)(<)",s)
print(ret.group()) #>wahaha<  和print(ret.group(0))结果一样
print(ret.group(1)) #>        数字参数代表取对应分组中的内容
print(ret.group(2)) #wahaha
print(ret.group(3)) #<
# search分组 通过数字显示


# findall
# 为了findall可以顺利取到分组中的内容,有一种特殊的语法,就是优先显示分组内容
ret= re.findall(">\w+<",s)
print(ret) #['>wahaha<']

ret= re.findall(">(\w+)<",s) #加括号会优先显示(\w+)的内容,两边的> < 就不显示了
print(ret) #['wahaha']

# 取消分组优先(?: 正则表达式)
ret= re.findall("\d+(\.\d+)?", "1.234.5.678")
print(ret)  #['.234', '.678'] python把正则中的括号当成了优先分组,所以取出来的是小数点之后的,
# 因为正则规则用了()规定小数,所以函数会当成优先级执行

ret2= re.findall("\d+(?:\.\d+)?", "1.234.5.678") #在括号中加上?: 可以取消优先级
print(ret2) #['1.234', '5.678']


#split
#没有分组的时候会把切掉的内容不显示,加上分组会一起显示出来
ret = re.split("\d+","alex29egon30")
print(ret)  #['alex', 'egon', '']

ret = re.split("(\d+)","alex29egon30")
print(ret)  #['alex', '29', 'egon', '30', '']


#分组命名 (?P<这个组的名字>正则表达式)
s = '<a>wahaha</a>'
ret = re.search('>(?P<name>\w+)<',s)#把想取出来的wahaha单独括起来了,并且加了 ?P 和一个名字 (name)
print(ret.group())  #>wahaha<
print(ret.group(1))  #wahaha  因为就一个分组,所以直接取wahaha
print(ret.group('name')) #wahaha  也可以通过组名取值


s = '<a>wahaha</a>'
pattern = '<(\w+)>(\w+)</(\w+)>'
ret = re.search(pattern,s)
print(ret.group(1) == ret.group(3))  # True 判断前后两个标签名 a a 字是否一致


s = '<a>wahaha</A>'
pattern = '<(\w+)>(\w+)</(\w+)>'
ret = re.search(pattern,s)
print(ret.group(1) == ret.group(3))  # False 判断前后两个标签名 a A 字是否一致

# 使用前面的分组 要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致 s = '<a>wahaha</A>' pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>' ret = re.search(pattern,s) print(ret) #None 前后分组的名字不一致, 返回None s = '<a>wahaha</a>' pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>' #要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致 ret = re.search(pattern,s) print(ret.group(2))

s = '<a>wahaha</a>'
pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>' #要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致
ret = re.findall(pattern,s)
print(ret) #[('a', 'wahaha')]


s = '<a>wahaha</a>'
pattern = r'<(\w+)>(\w+)</(\1)>' #\1 直接表示了第一个()里的内容, 这个没有tab,没有组名,直接用数字表达了,但是需要在字符串前加上一个r, 对\1转义
ret = re.findall(pattern,s)
print(ret) #[('a', 'wahaha', 'a')]

# 这些情况会用到 
#
2018-12-06
#
2018.12.6
#
2018 12 06
#
12:30:30