message = '钟南山、李春兰、乔杰'
result = re.match('钟南山', message)
print(result) # <re.Match object; span=(0, 3), match='钟南山'> span返回的是位置,0-3不包含3
print(result.span()) # (0, 3) 返回位置
print(result.group()) # 钟南山 返回匹配内容
result = re.match('李春兰', message)
print(result) # None 起始位置匹配不到返回none
result = re.search('李春兰', message)
print(result) # <re.Match object; span=(4, 7), match='李春兰'>
message = '11ndinwd1oin111wq11doqje9dged'
result = re.search('[abcde]', message) # 字符集合,匹配所包含的任意一个字符
print(result) # <re.Match object; span=(3, 4), match='d'>
result = re.search('[a-e]', message)
print(result) # <re.Match object; span=(3, 4), match='d'>
result = re.search('[a-e][0-9]', message) # 找到满足的第一个就会返回,不会继续匹配
print(result) # <re.Match object; span=(7, 9), match='d1'>
result = re.findall('[a-e][0-9]', message) # 搜索整个字符串,然后返回匹配正则表达式的所有内容,以列表的形式返回
print(result) # ['d1', 'e9']
print(dir(re))
result = re.findall('[a-z][0-9]+[a-z]', message) # 配合次数+ 至少一次
print(result) # ['d1o', 'n111w', 'q11d', 'e9d']
result = re.findall('[a-z][0-9]*[a-z]', message) # 配合次数 * 任意次可以为0次
print(result) # ['nd', 'in', 'wd', 'oi', 'n111w', 'q11d', 'oq', 'je', 'dg', 'ed']
result = re.findall('[a-z][0-9]?[a-z]', message) # 配合次数 ? 最多一次
print(result) # ['nd', 'in', 'wd', 'oi', 'wq', 'do', 'qj', 'e9d', 'ge']
# 验证手机号码的正确性 1开头,11位数字
phone_num = input("请输入手机号码:")
'''
请输入手机号码:123345656656666666666
'''
result = re.match('1[0-9]{10}', phone_num)
print(result) # <re.Match object; span=(0, 11), match='12334565665'>
result = re.findall('1[0-9]{10}', phone_num)
print(result) # ['12334565665']
result = re.findall('^1[0-9]{10}$', phone_num) # ^$限制行首行尾,只能为11位
print(result) # ['12345678912']
# 验证用户名的有效性
phone_num = input("请输入用户名:")
'''
请输入手机号码:123345656656666666666
'''
result = re.match('1[0-9]{10}', phone_num)
print(result) # <re.Match object; span=(0, 11), match='12334565665'>
result = re.findall('1[0-9]{10}', phone_num)
print(result) # ['12334565665']
result = re.findall('^1[0-9]{10}$', phone_num) # ^$限制行首行尾,只能为11位
print(result) # ['12345678912']
# 验证QQ号码 从5到11,开头不能为0
QQ_number = input("请输入您的QQ号:")
result = re.findall('^[1-9][0-9]{4,10}$', QQ_number)
print(result)
# 验证用户名,字母(大小写)数字下划线组成,数字不能开头,长度大于8位
user_name = input('请输入您的用户名:') #a1234567 1234567
result = re.findall('^[A-Za-z_][A-Za-z0-9_]{7,}$', user_name)
print(result) #['a1234567']
result = re.findall('^\D\w{7,}$', user_name)
print(result) #['a1234567'] [' 1234567']
result = re.findall('^[A-Za-z_]\w{7,}$', user_name)
print(result) #['a1234567'] []
message = 'verb very never every'
result = re.findall(r'\w+er\b', message) # \b为转义字符 \b匹配一个单词的边界,指单词和空格间的位置
print(result) # ['never']
result = re.findall('.e', message) # . 匹配除\n和\r之外的任何单个字符
print(result) # ['ve', 've', 'ne', 've', ' e', 've']
result = re.findall('ev|ry', message) # |:将两个匹配条件进行逻辑或运算
print(result) # ['ry', 'ev', 'ev', 'ry']
message = '''<div class="c-span4 opr-recommends-merge-item ">
data-click="{'rsv_re_ename':'百度知道','rsv_re_uri':'44dde322323233'}"
<div class="opr-recommends-merge-p">'''
result = re.findall('div class=".+"', message) # 匹配class的内容,div class="
print(result) # ['div class="c-span4 opr-recommends-merge-item "', 'div class="opr-recommends-merge-p"']
result = re.findall("'rsv_re_ename':.+'", message) # 匹配class的内容,div class="
print(result) # ["'rsv_re_ename':'百度知道','rsv_re_uri':'44dde322323233'"]
result = re.findall("'rsv_re_ename':.+,", message) # 匹配class的内容,div class="
print(result) # ["'rsv_re_ename':'百度知道',"]
# 匹配 rsv_re_ename 和 rsv_re_uri
result = re.findall("'rsv_re_ename':'(.+)','rsv_re_uri':'(.+)'", message) # 匹配class的内容,只返回组的内容
print(result) # [('百度知道', '44dde322323233')]
message = '<dt>首页</dt>'
result = re.findall(r'^<\w+>(.+)</\w+>$', message)
print(result)# ['首页']
result = re.findall(r'^<(\w+)>(.+)</\1>$', message) # 引用匹配,和前面匹配的内容一模一样,引用匹配从1开始
print(result)# [('dt', '首页')]
print(result[0][1]) # 首页
message = '<dt><a>首页</a></dt>'
result = re.findall(r'^<(\w+)><(\w)>(.+)</\2></\1>$', message)
print(result) # [('dt', 'a', '首页')]
print(result[0][2]) # 首页
# 当匹配内容非常多时,可以给子表达式起名字,?P<name>
result = re.findall(r'^<(?P<name1>\w+)><(?P<name2>\w)>(.+)</(?P=name2)></(?P=name1)>', message)
print(result[0][2]) # 首页
message = 'ccc739134792hd'
result = re.findall('ccc\d+', message) # 默认贪婪模式
result1 = re.findall('ccc\d+?', message) # 次数后面加? 转换为非贪婪模式
print(result, result1) #['ccc739134792'] ['ccc7']
message = '''<dt><a>首页
内容在这里</a></dt>'''
result = re.findall(r'^<(\w+)><(\w)>(.+)</\2></\1>$', message)
print(result) # []
result = re.findall(r'^<(\w+)><(\w+)>(.+)</\2></\1>$', message, re.S) # re.S 使.匹配包括换行在内的所有字符
print(result) # [('dt', 'a', '首页\n 内容在这里')]
content = 'dh932hf9f9623hhh2556'
content = re.sub('\d', 'O', content) # 将数字转换为O
print(content) # dhOOOhfOfOOOOhhhOOOO
# 分别将3个日期中的时间去掉
content1 = '2020-12-15 12:00'
content2 = '2020-12-17 12:00'
content3 = '2020-12-22 12:00'
pattern = re.compile('\d{2}:\d{2}') # compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,多个地方引用,实现复用
result1 = re.sub(pattern, '', content1)
result2 = re.sub(pattern, '', content2)
result3 = re.sub(pattern, '', content3)
print(result1, result2, result3) # 2020-12-15 2020-12-17 2020-12-22