1、什么是正则表达式?
正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的
2、基础语法?
读此篇,此篇也是参考文献:开头就是基础语法、进阶语法及例子
语法中需要注意类似于【’>‘、‘-’】等,有时必须加’\‘,有时不用。吃不准就都加‘\’。
3、你可能注意到了,‘py’也可以匹配’python’,但是加上^py$就变成了整行匹配,就只能匹配’py’了,why?
import re
print(re.match('py', 'python'))
#Output : <re.Match object; span=(0, 2), match='py'> 说明匹配成功
print(re.match('^py$', 'python'))
#Output : None 说明匹配失败
‘py’ 之所以能 匹配 ‘python’ ,其实这里只匹配了一部分,我们可以用group进行一个分组的提取,如下:
m = re.match('(py)', 'python')
print(m.groups())
#Output : ('py',) 证明只匹配了前面一小部分
‘^py$’ 之所以不 匹配 ‘python’ ,是因为代表了从p开始y结束,故不匹配
4、关于匹配的问题:
如果去判断一个邮件地址合不合法,一定要判断全,不能类似【‘py’ 匹配 ‘python’】,即便返回能匹配,但其实没有真正的判断。
5、关于goups分组提取的问题:
【group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串。】 错
【group(0)永远是正则匹配的字符串,group(1)、group(2)……表示第1、2、……个子串。】 对
>>> import re
>>> pattern = re.compile(r’(\d+)\w*?(\d+).‘) # 匹配:数字+字母+数字+任意字符
>>> pattern.match(‘132in234dhu’).groups()
(‘132’, ‘234’)
>>> pattern.match(‘132in234dhu’).group(0)
‘132in234dhu’
>>> pattern.match(‘132in234dhu’).group(1)
‘132’
>>> pattern = re.compile(r’(\d+)\w?(\d+)') # 匹配:数字+字母+数字 (剩余内容不匹配)
>>> pattern.match(‘132in234dhu’).groups()
(‘132’, ‘234’)
>>> pattern.match(‘132in234dhu’).group(0)
‘132in234’ # 注意这里!group(0)返回的不是原始字符串,而是与正则表达式匹配的字符串!!!
>>> pattern.match(‘132in234dhu’).group(1)
‘132’
6、**关于group分组提取字符串时,不一定需要全部匹配,可以只匹配需要提取的那部分,**例如:
版本二可以提取出带名字的Email地址:
tom@voyager. org => Tom Paris
bob@example. com => bob
代码如下:
def name_of_email(addr):
re_addr = re.compile(r'<?([A-Za-z\s]+)>?') #提前编译,匹配时只用匹配需要的前面那部分即可
name = re_addr.match(addr).group(1)
return name
def main:
# 测试:
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print('ok')
if __name__ == '__main__':
main() #Output : ok