正则表达式可以判断目标字符串是否是符合特定的要求,是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
1.Python提供re模块,包含所有正则表达式的功能。在正则表达式中,\d表示可以匹配一个数字,\w表示可以匹配一个字母或者数字,比如:
pattern = re.compile('(\d+)(\w+)')
content = '123helloWorld'
# match 匹配
result = re.match(pattern,content)
if result :
# 返回的是一个匹配的对象
print(result)
# 返回的是符合要求的全部内容
print(result.group(0))
print(result.group(1))
print(result.group(2))
else :
print('不符合')
match匹配的内容是从字符串开始部分进行,否则,输出结果为None。比如:
pattern = re.compile('my')
result = re.match(pattern,'myself')
print(result.group(0))
result = re.match(pattern,'love myself')
print(result)
2.正则表达式中,\s表示空格;.表示任意的内容,那么a.就是在a后面匹配任意的内容;*表示匹配的内容出现0到多次;+表示匹配的内容出现1次到多次;?表示匹配内容出现0次到1次。
3.贪婪模式与非贪婪模式,正则表达式中默认为是贪婪模式,尽量找到所有的符合要求的内容。
.* 称之为贪婪模式
# 找到一个以a开头,以最后一个b结尾的字符串
content = 'aabbababallb22'
pattern = re.compile('(a.*b)')
result = pattern.match(content)
print(result)
.*? 称之为非贪婪模式
# 以a开头,以第一个b结尾的字符串
content = 'aabbababallb22'
pattern = re.compile('(a.*?b)')
result = pattern.match(content)
print(result)
*+ 同为贪婪模式
content = 'aabbababallb22'
pattern = re.compile('(a.+b)')
result = pattern.match(content)
print(result)
4.在正则表达式中,^表示以......开头,$表示以......结尾;{n}表示匹配内容重复n次,也可以表示为\d{n};{n,m}表示匹配内容最少重复n次,最多重复m次,也可以表示为\d{n,m};{n,}表示匹配内容最少重复n次,{,m}表示匹配内容最多重复m次。
匹配连续3个数字
content = 'aabbababallb22'
pattern = re.compile(r'\d{3}')
result = pattern.match(title)
print(result)
匹配全国固定电话
pattern = re.compile(r'(\d{4})-(\d{8})')
result = pattern.match('0371-66666666')
print(result)
print(result.group(1))
print(result.group(2))
5.| 或者,设置用于不同情况的正则
pattern = re.compile('((haha|heihei)balabala)')
result = pattern.match('hahabalabala')
result = pattern.match('heiheibalabala')
print(result)
search 找到字符串当中第一个负责正则的内容
pattern = re.compile(r'you')
result = pattern.search('I love you,I miss you,I hate you')
print(result)
findall 找到所有符合内容
content = '12345,55555'
pattern = re.compile(r'\d{5}')
result = pattern.findall(content)
print(result)
sub 替换子串
content = '杨 过对战金轮法王,郭靖观战'
pattern = re.compile(r'杨\s*过')
result = pattern.sub('吕布',content)
print(result)
content = '杨 过对战金轮法王,郭靖观战'
key_word = [
(r'杨\s*过','吕布'),
(r'金轮法王','服部半藏'),
(r'郭靖','东方不败')
]
for pattern,replace in key_word :
pattern = re.compile(pattern)
content = pattern.sub(replace,content)
print(content)
匹配手机号
pattern = re.compile(r'^((13[0-9)|(14[67]|(15[0-3]|15[5-9]|(18[0,5-9]))\d{8}))$')
result = pattern.match('15003875200')
print(result)