Python练习-正则表达式
本部分练习通过Python使用正则表达式。正则表达式是编程里一个很常用,很基础的知识,这里不做赘述。具体规则可以查阅关于正则学习的相关资料。这里重点练习通过Python编程使用正则表达式的方法。 在Python中,通过re模块来使用正则表达式,如:
1
2
3
4
5
6
7
8
9
10
# Python 中正则表达式,强烈建议使用r前缀,避免转义
import re
print(re.match(r"\d{4}-\d{8}", "0411-12345678"))
print(re.match(r"\d{4}-\d{8}", "0411-1234567"))
if re.match(r"\d{4}-\d{8}", "0411-12345678"):
print("Match, OK!")
else:
print("Don't match.")
输出如下:
<re.Match object; span=(0, 13), match=’0411-12345678’> None Match, OK!
在Python中,re.match函数如果匹配则返回Match对象,如果不匹配返回None
其他使用场景包括通过正则拆分字符串,分组字符串等,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 可以更灵活的切分字符串,例如按空格切分(1个或者多个)
print(re.split(r"\s+", "a b c"))
# 或者更灵活的按照给定的字符串切分
print(re.split(r"[\s,;]+", "a,b;c d e"))
# 分组
g = re.match(r"(^\d{4})-(\d{8})$", "0411-12345678")
# group(0)永远是与整个正则表达式相匹配的字符串
print(g.group(0))
print(g.group(1))
print(g.group(2))
# 贪婪匹配,也就是尽可能多的匹配字符,如果增加?则改贪婪匹配为最小化匹配。
print(re.match(r'^(\d+?)(0?)(\d+?)(0*)$', '12202300').groups())
print(re.match(r'^([1-9]+)(0*)(\d+?)(0*)$', '12202300').groups())
# 先编译表达式,反复使用
re_com = re.compile(r'^([1-9]+)(0*)(\d+?)(0*)$')
print(re_com.match("12202300").groups())
print(re_com.match("123234200233430000").groups())
输出如下:
[‘a’, ‘b’, ‘c’] [‘a’, ‘b’, ‘c’, ‘d’, ‘e’] 0411-12345678 0411 12345678 (‘1’, ‘’, ‘22023’, ‘00’) (‘122’, ‘0’, ‘23’, ‘00’) (‘122’, ‘0’, ‘23’, ‘00’) (‘1232342’, ‘00’, ‘23343’, ‘0000’)
最后,两个小练习:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 练习练习
# 请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email:
# someone@gmail.com
# bill.gates@microsoft.com
def is_valid_email(addr):
re_email = re.compile(r"^[\w.]+@\w+.\w+$")
is_match = False
if re_email.match(addr):
is_match = True
return is_match
# 测试:
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')
# 版本二可以提取出带名字的Email地址:
# <Tom Paris> tom@voyager.org => Tom Paris
# bob@example.com => bob
def name_of_email(addr):
re_mail_com = re.compile(r"@")
mailaddr = re_mail_com.split(addr)[0]
print(mailaddr)
name = mailaddr
if mailaddr.startswith("<"):
re_name = re.compile(r"^(<)([\w\s]+)([>\w\s]+)$")
name = re_name.match(mailaddr).group(2)
print(name)
return name
# 测试:
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print('ok')
本文由作者按照 CC BY 4.0 进行授权