正则表达式的match、search、findall、finditer
@2022/7/13 重新梳理正则模块各个方法的使用
太长不看版:
例如,判断一个字符串是否符合手机号或邮箱的正则,使用match或search都行。只会匹配一次,匹配成功就返回结果,匹配不到就失败。
pattern = re.compile('1[0-9]{10}')
result = pattern.match('13712341234')
print(result)
print(result.group())
例如,需要从一段html里获取所有的图片url,使用findall或finditer;如果仅需要获取图片url中的文件名,配合分组食用最佳。如果使用了分组,只能使用finditer
pattern = re.compile('http://[a-z0-9\./]*\.com/img/([0-9a-z]*)\.[a-z]{3,4}')
result = pattern.finditer('<div><img href="http://xx.com/img/a.jpg"></img><img href="http://xx2.com/img/b.gif"></img></div>')
if result:
for m in result:
print(m.group(1))
print(m.group())
分组,比如写了一个长的正则,但是我们只关心其中的一部分,那么我们关心的这部分添加到分组即可。
但是,所有的所有,都是基于写了正确的正则表达式,否则都是一场空。写出合适的正则,能够达到事半功倍的效果。
从字符串的开始去匹配,如果不符合,则匹配失败。与 ^[0-9]{3} 效果类似(^匹配一行的开始)
print('match------------------------------------------')
# match 从字符串的开始去匹配,如果不符合,则匹配失败。与 ^[0-9]{3} 效果类似(^匹配一行的开始)
# 需要匹配3个数字
pattern = re.compile(r'[0-9]{3}')
# 匹配到的情况,成功
result = pattern.match('123')
if result:
print(result.group())
# 第一个字符是a,不符合正则,失败
result = pattern.match('abc123')
if result:
print(result.group())
else:
print('--no--')
# 123符合正则,找到一个匹配的结果则不再继续匹配
result = pattern.match('123456')
if result:
print(result.group())
else:
print('--no--')
从整个字符串中去找一个匹配的结果,直到找到一个为止。
print('search------------------------------------------')
# search
pattern = re.compile(r'[0-9]{3}')
result = pattern.search('123')
if result:
print(result.group())
# 虽然第一个字符是a,但是后面能找到连续的3个数字,匹配成功
result = pattern.search('asd321')
if result:
print(result.group())
# 匹配到了334,匹配结束
result = pattern.search('334667')
if result:
print(result.group())
返回所有匹配的字符串,放到一个列表里
print('findall------------------------------------------')
# findall
pattern = re.compile(r'[0-9]{3}')
result = pattern.findall('123666')
if result:
print(result)
result = pattern.findall('238aaa666zz999')
if result:
print(result)
返回所有匹配的字符串,放到一个迭代器
print('finditer------------------------------------------')
# finditer
pattern = re.compile(r'[0-9]{3}')
result = pattern.finditer('a235111a')
if result:
for m in result:
print(m.group())
print('----')
result = pattern.finditer('235aaa888zz000')
if result:
for m in result:
print(m.group())
配合分组用法
print('match------------------------------------------')
pattern = re.compile('(\d{3})-(\d{3})-\d{2}')
# 依旧是match从开头匹配。只不过这个正则表达式用到了分组,一个括号就是一个分组
# 如果第一个字符不匹配,要么写完整的正则来匹配整个字符串,然后根据分组获取自己需要的部分。要么使用search或findall或finditer
result = pattern.match('707-827-827asdf123-456-456')
if result:
# print(result.group(0)) # 默认就0
print(result.group(1)) # 获取第一个分组匹配的结果
print(result.group(2))
# print(result.group(3)) #没有第3个分组,会报错
print(result.group()) # 获取整个正则匹配的结果
匹配到多个符合的字符串会返回一个数组,但是只有分组的部分被返回
print('findall------------------------------------------')
# 匹配所有字符串,但是仅仅匹配分组中的部分
pattern = re.compile('(\d{3})-(\d{3})-\d{2}')
result = pattern.findall('zz707-827-827asdf123-456-456zz000-42-a')
if result:
print(result)
使用finditer除了能单独获取分组部分,也能获取整个正则匹配的结果
print('finditer------------------------------------------')
# 匹配所有字符串,但是仅仅匹配分组中的部分
result = pattern.finditer('zz707-827-827asdf123-456-456zz000-42-a')
if result:
for m in result:
print(m.group())
print(m.group(1))
print(m.group(2))
print('-----')