第63天:正则表达式
正则表达式是一个特殊的字符串序列、一种模式,用来判断字符串是否符合这种模式,如:判断邮件地址是否有 @
符号,判断手机号是否正确等待。
基本语法
在正则表达式中,可以使用 \d
匹配数字,\w
匹配数字和子母,.
可以匹配除了换行符之外的任意字符,\s
匹配空白字符
1\d
可以匹配 12
、13
a\w
可以匹配 ab
、ac
.abc
可以匹配 aabc
、~abc
、abc
上面是单个字符匹配,要匹配长字符串在正则表达式中,用 +
表示匹配至少一个字符,用 ?
表示匹配0或1个字符,用 {n}
表示匹配n个字符,用 {n,m}
表示匹配n-m个字符
test.+
可以匹配 testPython
、testPy
,无法匹配 test
test?
可以匹配 tes
、test
,无法匹配 testPython
test.{6}
可以匹配 testPython
,无法匹配 testPy
test.{1,6}
可以匹配 testPython
、testPy
,无法匹配 test
复杂的正则
正则表达式可以更加的复杂:([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})
( ):表示分组
[ ]:表示在[ ]内的任意一个字符
([A-Za-z0-9_-.]+):表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 [_]、减号 [-]、点号 [.] 中的至少一个字符 [+] ,在正则表达式中减号 [-] 和点号 [.] 是特殊字符需要使用 [] 转义
@:邮件中的@符号
([A-Za-z0-9_-.]+):表示以大写字母 [A-Z]、小写字母 [a-z]、数字 [0-9]、下划线 [_]、减号 [-]、点号 [.] 中的至少一个字符 [+],如:qq,sina
.([A-Za-z]{2,4}):表示以点号 [.] 连接2-4 [{2,4}] 个字符的大写字母 [A-Z] 和小写字母 [a-z]
([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})
可以匹配 abc@qq.com
、 ABCabc1234@qq.com
、 abc_123-xyz@sina.cn
Python中的正则表达式
匹配
在Python中提供了包含了所有正则表达式功能的 re
模块,用 re
中的match()
函数判断是否匹配成功,如果匹配成功则返回 Match
对象,否则返回 None
,在 Python 中字符串用 \
转义,使用 r
前缀可以不用考虑转义的问题
>>> import re
>>> re.match(r'1\d', '13')
<re.Match object; span=(0, 2), match='13'> # 匹配成功返回Match对象
>>> re.match(r'1\d', '23') # 匹配失败返回None
>>>
分组
在爬虫中一般需要提取出匹配成功的子字符串。用 ( ) 分组就可以提取出子字符串比如上面的邮件正则表达式,在Python中使用 Match
对象的 group()
函数提取出子字符串,groups()
函数返回所有子字符串的元组
([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})
定义了3个组,可以提取出 @ 符之前的字符串和域名
>>> email = re.match(r'([A-Za-z0-9_\-\.]+)\@([A-Za-z0-9_\-\.]+)\.([A-Za-z]{2,4})', 'abc@qq.com')
>>> email.group(0)
'abc@qq.com'
>>> email.group(1)
'abc'
>>> email.group(2)
'qq'
>>> email.group(3)
'com'
在 group()
函数中group(0)
永远是字符串本身,group(1)
、group(2)
、group(3)
...表示第一、第二、第三...个子字符串。
替换
re
模块中提供了 sub()
函数替换子字符串的内容
# 删除字符串中的空格
>>> test = '021- 1101101 10'
>>> re.sub(r'\s','',test)
'021-110110110'
sub()
函数中被替换的字符串也可以使用函数
import re
# 把数字加上100
def num(match):
value = int(match.group('num'))
return str(value + 100)
test = 'abc12defg980'
result = re.sub(r'(?P<num>\d+)', num, test)
print(result)
编译
在使用 re
模块的时候,Python 帮我们做了两件事:
编译正则表达式,如果正则表示不合法会报错 用编译后的正则表示匹配字符串
re
模块中可以使用 compile()
函数预编译正则表示
>>> import re
>>> test = re.compile(r'test(.{1,6})')
>>> test.match('testPy').groups()
('Py',)
>>> test.match('testPython').groups()
('Python',)
compile()
函数构造出来的是一个 Pattern
对象。提供了一些属性读取正则表达的相关信息。
pattern:编译的正则表达式 groups:表达式中的分组数量 flags:编译时的匹配模式
>>> test = re.compile(r'test(.{1,6})')
>>> test.pattern
'test(.{1,6})'
>>> test.groups
1
>>> test.flags
32
总结
正则表达式非常的强大,这里只介绍了它的一小部分内容,让大家对正则表达式的概念和使用有一个清晰的了解。
示例代码:https://github.com/JustDoPython/python-100-day/tree/master/day-063
系列文章