re 正则表达式

import re

# . 匹配任意字符(不包括 换行符) 匹配换行符
p3 = '123\n456'
print(re.match('.*',p3,re.S).group()) #匹配换行符

# matchsearch

p1 = "<div class='comm-topact-inner'><a class='top-act-link middle' href='https://lol.qq.com/act/a20200807spiritblossom/index.html?e_code=507041' >查看详情</a></div></div>"

match_p1 = '<div (.*)(</div>)</div>'
match_p2 = '^<\d*>$'

# print(re.match(match_p1,p1).group(1))   #取第一个括号内的内容
# print(re.match(match_p1,p1).group(2))    #取第二个括号内的内容
# print(re.match(match_p,p1))    # match 只能从头开始匹配,匹配不到返回None 没类型不能用group看值
# print(re.search(match_p,p1).group(1))   # search 可以从任意位置开始,只要匹配到即可
# print(re.search(match_p2,p2))    #以^开头以$结尾匹配就必须是 否则报错

# 贪婪模式 与 ? 非贪婪限定符
str1 = 'h123h456h789'
print(re.search('h(.*)h',str1).group(1))   #尽量多的匹配叫 贪婪模式             >>>123h456
print(re.search('h(.*?)h',str1).group(1))   #贪婪模式 限定符       >>>123

# * 代表0-无穷
# ? 的用法: ?前面是个数的限定符(例如 */.{5,10}等) 代表的是非贪婪限定符, ?前面是字符 代表字符数为0-1个
#大括号 {}
print(re.search('h.{1,10}?h',str1))
print(re.search('h.+?h',str1))
print(re.search('h.{5}',str1))

# | 或
email = '594153033@qq.com'
print(re.match('[a-zA-Z0-9_]+@(qq|163|126).com',email))
#中括号[] 中括号内的字符可以被匹配
str2 = 'abcd12312'
# 匹配的所有字符 都包含在中括号里,否则不能被匹配到
print(re.search('[0-2]+',str2)) #\d=[0123456789]=[0-9]

# ^ 以什么开头、不以什么开头
str3 = '123456'
print(re.search('^1',str3))
print(re.search('^1*',str3)) # 以1开头 已经匹配到1 所以*/+不进行匹配
print(re.search('[^12]+',str3)) # 不以12开头
print(re.match('[^12]',str3)) # match必须从头匹配 不以12开头 所以匹配不到
# \ 转义字符
print(re.search('a+','aaaabc'))
print(re.search('a+','a+aaabc'))
print(re.search('a\+','a+aaabc'))

 

# findall 用法 全部匹配 返回列表
str4 = 'this is Apple,very good'
print(re.search('[a-zA-Z-]+',str4)) # 只能匹配一个 >> this
print(re.findall('[a-zA-Z-]+',str4))

#finditer 用法 全部匹配 返回生成器
str4 = 'this is Apple,very good'
iter_ = re.finditer('[a-zA-Z-]+',str4)
# for i in iter_:
# print(i.group())

# compile 能生成一个类,用于匹配数据 性能更高
str4 = 'this is Apple,very good'
print(re.search('[a-zA-Z-]+',str4))
# 用search 跟下面的两行输出 是一样的 那为什么要用两行? 可查看 ctrl+b search的返回
pat = re.compile('[a-zA-Z-]+')
res_match = pat.search(str4)
print(res_match,'---------------')
# 为什么使用compile :类的频繁创建与删除 会造成性能问题
# 什么时候用 :循环匹配的时候 就需要compile生成一个类

lists = [
  'this is Apple,very good',
  'this is Apple,very good',
  'this is Apple,very good',
  'this is Apple,very good',
]
pat = re.compile('[a-zA-Z-]+')

for list_ in lists:
  res_match = pat.search(list_)
  print(res_match)

# sub 替换 所有匹配项 全部替换
str4 = 'this is Apple,very good 123'
print(re.sub('[a-zA-Z-]+','that',str4))

posted @ 2020-09-28 21:06  Py_beginner  阅读(83)  评论(0编辑  收藏  举报