Python 中正则应用
发布时间 2020年5月9日 • 2 分钟 读完 • 267 字Python 中正则应用
正则在线工具访问https://tool.oschina.net/regex#
测试文本 Hello,my phone number is 010-86432100 and email is abcdef@gmail.com, and my weisite is http://codingbing.com
content = 'Hello 123 4567 World_This is a Regex Demo'
ret = re.match('^Hello\s\d+\s\d{4}\s\w{10}',content)
print(ret)
# 输出匹配的内容
print(ret.group())
# 输出匹配的范围
print(ret.span())
# 结果
<re.Match object; span=(0, 25), match='Hello 123 4567 World_This'>
Hello 123 4567 World_This
(0, 25)group() 方法输出匹配内容span() 方法输出匹配的范围使用 () 括号,将想提取的子字符串括起来,根据第几个()的索引,使用 group() 方法,即可提取结果
content = 'Hello 123 4567 World_This is a Regex Demo'
ret = re.match('^Hello\s\d+\s(\d{4})\s\w{10}',content)
print(ret)
# 输出匹配的内容
print(ret.group(1))
# 输出匹配的范围
print(ret.span())
# 结果
<re.Match object; span=(0, 25), match='Hello 123 4567 World_This'>
4567
(0, 25)出现空白符就写 \s,出现数字就用 \d,这样工作量非常大,可以使用 .* 万能匹配符号匹配减少工作量,
. 可以匹配任意字符(除换行符)*匹配前面的字符无限次content = 'Hello 1234567 World_This is a Regex Demo'
# ret = re.match('^Hello(.*)Demo$', content)
ret = re.match('^He.*(\d+).*Demo$',content)
# 输出匹配的内容
print(ret.group(1))
# 输出匹配的范围
print(ret.span())
# 结果
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
7
(0, 40)在贪婪模式下 .* 会匹配尽可能多的字符,.* 后面是 \d+,是至少一个数字,因此.*把前面的123456给匹配走了,剩下一个数字7留给了\d+
非贪婪匹配 .*? 代替 .* 写法:
content = 'Hello 1234567 World_This is a Regex Demo'
ret = re.match('^He.*?(\d+).*Demo$',content)
print(ret.group(1))
# 结果
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
1234567content = '''Hello 1234567 World_This
is a Regex Demo'''
result = re.match('^He.*?(\d+).*?Demo$', content, re.S)
print(result.group(1))
# 结果
1234567re.i 使匹配对大小写不敏感re.L 做本地化识别(locale-aware)匹配re.M 多行匹配,影响 ^ 和 $re.S 使匹配包括换行在内的所有字符re.U 根据 Unicode字符集解析字符。这个标志影响 \w、\W、\b 和 \Bre.X 该标志可以提供更灵活的格式以便将正则表达式写的更易于理解把一串文本中的所有数字都去掉
import re
content = 'Bs53ASssdf01FRBccw32'
content = re.sub('\d+','',content)
print(content)
# 结果
BsASssdfFRBccw将正则字符串编译成正则表达式对象,以便后面的匹配复用
content1 = '2020-05-10 13:09:30'
content2 = '2020-05-11 13:09:50'
content3 = '2020-05-11 13:10:08'
pattern = re.compile('\d{2}:\d{2}:\d{2}')
result1 = re.sub(pattern,'',content1)
result2 = re.sub(pattern,'',content2)
result3 = re.sub(pattern,'',content3)
print(result1,result2,result3)
# 结果
2020-05-10 2020-05-11 2020-05-11 The end!