吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1342|回复: 11
收起左侧

[讨论] 正则表达式解决两道题目

[复制链接]
甜萝 发表于 2022-10-2 15:39
本帖最后由 paypojie 于 2022-10-2 17:31 编辑

                                                                                              实践出真知 嘿嘿


最近复习了一下正则表达式 写两道题目练手 题目来源自 https://www.liaoxuefeng.com/wiki/1016959663602400/1017639890281664
最近明白一个道理 看的懂 不一定写得出 之前也学习过正则表达式 昨天复习了一下正则表达式知识 然后开始愉快(bushi)的解题


题目一

请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email:
  • someone@gmail.com
  • bill.gates@microsoft.com




第一题非常简单 我给出了如下的解法

[Python] 纯文本查看 复制代码
import re
def is_valid_email(addr):
    r = re.compile(r'[a-z\.]+@[a-z]+\.[a-z]+')
    m = r.match(addr)
    # print(m.group()) # 无用的代码 
    return(m)

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')


测试结果:


QQ截图20221002141907.png


第一步 导入re模块 re模块包含了正则表达式中所有功能
第二步 编写函数 函数返回结果 用assert断言进行检查 返回结果必须为真 否则后面的代码一定出错
最后一步 如果通过测试 就输出ok

讲一讲第二步函数是干啥的 先用re模块中的compile()方法创建一个正则表达式 这个正则表达式用来测试邮箱地址 由于python正则表达式默认是贪婪模式 所以[a-z\.]+匹配多个由小写字母和点组成的字符串 @匹配@ 接着 [a-z+\.匹配一个或者多个小写字母以及一个点 因为点在正则表达式中是特殊符号 所以用反斜杠转义 \. 最后[a-z+ 匹配一个或者多个小写字母 compile()方法会返回一个Regex对象 对这个regex对象调用math()方法 math()传入待匹配的文本 匹配成功返回math对象 匹配失败返回None

QQ截图20221002145827.png

其实正则表达式可以写的更简单 例如 函数中的正则表达式可以替换成上面截图中的这种
r = re.compile(r'[^-][a-z\.]+@.*')

输出结果都是ok

第一题完成 第二题做了半天 自己摸索出来的

题目二

版本二可以提取出带名字的Email地址:




[Python] 纯文本查看 复制代码
import re
def name_of_email(addr):
    # r = re.compile(r'<?(T|tom)[(A-Za-z\s)]*>?[\sa-z]*.*')
    # r = re.compile(r'<?(T|tom)[(A-Za-z\s)]*>?')
    r = re.compile(r'<?((T|tom)[(A-Za-z\s)]*)>?')
    m = r.match(addr)
    return m.group(1)

name_of_email('<Tom Paris> [url=mailto:tom@voyager.org]tom@voyager.org[/url]') == 'Tom Paris'
name_of_email('tom@voyager.org') == 'tom'
print('ok')


测试结果

QQ截图20221002150630.png

忘记把注释中的代码去掉了                                                                                                                    



第一步 还是导入re模块 就不重复解释了
第二步 定义相关函数
第三步 调用函数 并判断函数返回结果是否与==右边的名字相等
最后打印ok

重点介绍函数里面的正则表达式  r'<?((T|tom)[(A-Za-z\s)]*)>?'
正则表达式前面加了前缀r 意思是后面的字符串保持原始含义 创建正则表达式时 最好添加前缀r    在本题中 不加r也可以正常输出ok 但还是建议加r 养成好习惯很重要 下面截图中正则表达式没加前缀r 也可以输出ok 还有就是截图中的group(1)改成group(0)或者group()也没关系 可以输出ok 我也不知道为啥 没细究 嘿嘿

QQ截图20221002152257.png

r'<?((T|tom)[(A-Za-z\s)]*)>?'

<?表示匹配零个或者一个又尖括号 <可有可无
((T|tom)[(A-Za-z\s)]*) 最外层的那一对小括号 () 表示捕获分组  (T|tom)中的竖杠表示或的意思 匹配Tom或者tom  
[(A-Za-z\s)]* 匹配任意个数(包括零)的大小写字母以及空白字符
>? 匹配零个或者一个右尖括号

完结 欢迎各位吾友评论   

把话撂这里了 无论多少评论 都回复













免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
woyucheng + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 甜萝 发表于 2022-10-2 15:45
本帖最后由 paypojie 于 2022-10-2 16:33 编辑

这个发帖的超链接该如何添加 这是困扰我已久的问题 就像下面这种

https://www.52pojie.cn/thread-1695117-1-1.html

fanvalen 发表于 2022-10-2 16:48
 楼主| 甜萝 发表于 2022-10-2 17:02
fanvalen 发表于 2022-10-2 16:48
中文名&
name
实际中你中招了吗

帖子中的超链接 我真的不知道怎么添加 笑哭

一样的方式 却无法添加超链接

塞北的雪 发表于 2022-10-2 17:04
 楼主| 甜萝 发表于 2022-10-2 17:07
塞北的雪 发表于 2022-10-2 17:09
我的意思是你第一个规则过不了
52896009 发表于 2022-10-2 17:25
二级域名遇到过没?
数字遇到过没?
 楼主| 甜萝 发表于 2022-10-2 17:27
塞北的雪 发表于 2022-10-2 17:09
我的意思是你第一个规则过不了

还是不太明白 可否具体点
 楼主| 甜萝 发表于 2022-10-2 17:28
52896009 发表于 2022-10-2 17:25
二级域名遇到过没?
数字遇到过没?

头像好看 嘿嘿
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表