Python入门基础总结笔记——正则表达式
完整基础知识参看网站:正则表达式
总结重点
用\d可以匹配一个数字,\w可以匹配一个字母或数字
用*表示任意个字符(包括0个),用+表示至少一个字符
用?表示0个或1个字符
用{n}表示n个字符,用{n,m}表示n-m个字符:
练习一:
请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email:
someone@gmail.com
bill.gates@microsoft.com
import re #正则表达式用到re模块
def is_valid_email(addr):
#match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None
#使用Python的r前缀,就不用考虑转义的问题
if (re.match(r'^\w+\.?\w+\@\w+\.com',addr)):
return True
else:
return False
# 测试:
assert is_valid_email('someone@gmail.com')
assert is_valid_email('bill.gates@microsoft.com')
assert not is_valid_email('bob#example.com')
assert not is_valid_email('mr-bob@example.com')
print('ok')
#结果
ok
练习二:
版本二可以提取出带名字的Email地址:
tom@voyager.org => Tom Paris
bob@example.com => bob
import re
def name_of_email(addr):
m=re.match(r'^<?(\w+\s*\w*)>?\s*\w*\@\w+\.org',addr)
if m == None:
return None
else:
return m.group(1)
# 测试:
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print('ok')
#结果
ok
其中group具有提取分组的能力:
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object; span=(0, 9), match='010-12345'>
>>> m.group(0) #原始字符串
'010-12345'
>>> m.group(1) #第一个字符串(括号)
'010'
>>> m.group(2) #第二个字符串(括号)
'12345'