🐍 Python
Python 与大数据
MySQL、Hadoop、自动化与基础工具
🎨 视觉封面Python练习-正则表达式
📅 2022-09-08·✍️ onecode·计算中...·⏱️ 6 分钟
#Python
本部分练习通过Python使用正则表达式。正则表达式是编程里一个很常用,很基础的知识,这里不做赘述。具体规则可以查阅关于正则学习的相关资料。这里重点练习通过Python编程使用正则表达式的方法。
在Python中,通过re模块来使用正则表达式,如:
PYTHON
# 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
其他使用场景包括通过正则拆分字符串,分组字符串等,代码如下:
PYTHON
# 可以更灵活的切分字符串,例如按空格切分(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')
最后,两个小练习:
PYTHON
# 练习练习
# 请尝试写一个验证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')
💡 OneCoder 资源指引
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
🤝 技术交流与答疑
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
📚
猜你想读 · 相关文章推荐
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com
💬 读者留言与交流
还没有留言,快来成为第一个讨论者吧!