Python随笔——正则表达式

本文介绍了Python正则表达式的基本概念、常用方法如match、search、findall等,并详细讲解了正则表达式的语法,包括匹配单个字符、区间匹配、特殊符号的使用以及量词符号等。

正则表达式–随笔

一、什么是正则表达式

正则表达式(regular expression)是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式有自己独立的操作处理引擎,可以匹配任何的编程语言。
我个人理解,正则表达式本质上是用于对字符串进行筛选的规则。但是如果系统自带的字符串能完成对应操作,尽量使用系统字符串提供的功能,因为它的处理效率比正则表达式要高!

二、使用正则表达式

Python提供的机制是存放再re模块下的。若要使用,则首先需要导入re模块
import re
接下来:
第一步:生成正则对象(指定匹配规则)
第二步:根据需要使用对应的匹配方法(放置待校验的字符串)
注:匹配方法有:match,search,findall,finder,split,sub,subn

match

当匹配规则(正则表达式)中没有设置^开头和\$结尾限制时,match的作用相当于验证待校验的字符串是否以正则表达式对应的字符串内容开头;	
当有设置^开头和\$结尾限制时,match的作用为检查待校验的字符串整体内容是否符合正则表达式中的内容。
匹配成功:返回Match对象,
匹配失败:返回None
#案例
import re
#生成正则对象(匹配规则)
re_obj = re.compile("hello")
#match匹配(待校验的字符串)
res = re_obj.match("hello KiKi,nice to meet you")
print(res)

re_obj2 = re.compile("^hello$")
res2 = re_obj2.match("HEllo KiKi,nice to meet you")
print(res2)

re_obj3 = re.compile("hello")
res3 = re_obj3.match("HEllo KiKi,nice to meet you")
print(res3)

执行结果如下:

<_sre.SRE_Match object; span=(0, 5), match='hello'>
None
None

search

在待校验的字符串中查找是否有满足正则表达式的字串;
如果有,返回匹配到的第一个字串对应的Match对象;没有,返回None
#案例
import re
re_obj = re.compile("to")
res = re_obj.search("nice to meet you,nice to meet you too")
print(res)

执行结果如下:

<_sre.SRE_Match object; span=(5, 7), match='to'>

findall

查找所有与规则匹配的对象,将匹配成功的子串存放再列表中然后返回。
import re
s = "i13love14you520"
#匹配所有正整数
re_obj = re.compile("[0-9]+")
res_list = re_obj.findall(s)
print(res_list)

执行结果如下:

['13', '14', '520']

finditer

查找所有与规则匹配的对象,将这些对象放在迭代器中。
import re
s = "i13love14you520"
#匹配所有正整数
re_obj = re.compile("[0-9]+")
res_iter = re_obj.finditer(s)
print(res_iter)
for ele in res_iter:
	print(ele)

执行结果如下:

<callable_iterator object at 0x000001E15FB87C88>
<_sre.SRE_Match object; span=(1, 3), match='13'>
<_sre.SRE_Match object; span=(7, 9), match='14'>
<_sre.SRE_Match object; span=(12, 15), match='520'>

split

在待切割的字符串中以正则表达式对应的内容为切割符,将匹配成功的子串放在列表中,最后返回一个列表。
import re
s = "i13love14you520"
#以非数字进行切割
re_obj = re.compile("[^0-9]+")
res_list = re_obj.split(s)
print(res_list)

#去除所有空字符串,得到仅有整数组成的子串
str_list = [ele for ele in res_list if ele!=""]
print(str_list)
#将所有子串以加号拼接
res_str = "+".join(str_list)
#借助eval函数自动的算出结果
print(f"{res_str}={eval(res_str)}")

执行结果如下:

['', '13', '14', '520','']
['13', '14', '520']
13 + 14 + 520 = 547

sub

sub()执行的是替换操作
方式一:sub(新字串 , 待校验的字符串)
#案例
#将所有的1换成一
import re
s = "20190101"
re_obj = re.compile("1")
res = re_obj.sub("一",s)
print(res)
#20一90一0一
方式二:第一个参数接收一个函数
def func(match_obj):#形参用来接收查找到的内容对应的每一个Match对象
	return  替换后的新的子串
sub(func  ,s)
#案例:将所有数字都+1
import re
s = "猪场共有18900人"
def old_new(match_obj):
	print(match_obj)
	return str(int(match_obj.group())+1)#.group()用来获取Match对象里的值

re_obj = re.compile("[0-9]")
res = re_obj.sub(old_new,s)
print(res)

执行结果如下:

<_sre.SRE_Match object; span=(4, 5), match='1'>
<_sre.SRE_Match object; span=(5, 6), match='8'>
<_sre.SRE_Match object; span=(6, 7), match='9'>
<_sre.SRE_Match object; span=(7, 8), match='0'>
<_sre.SRE_Match object; span=(8, 9), match='0'>
猪场共有291011

subn

返回的是元组(替换之后的新字符串,替换的的次数)
import re
s = "猪场一共有180900人"
def old_new(match_obj):
	print(match_obj)
	return str(int(match_obj.group()) + 1)

re_obj = re.compile("[0-9]")
res = re_obj.subn(old_new,s)
print(res)

执行结果是:

<_sre.SRE_Match object; span=(5, 6), match='1'>
<_sre.SRE_Match object; span=(6, 7), match='8'>
<_sre.SRE_Match object; span=(7, 8), match='0'>
<_sre.SRE_Match object; span=(8, 9), match='9'>
<_sre.SRE_Match object; span=(9, 10), match='0'>
<_sre.SRE_Match object; span=(10, 11), match='0'>
('猪场一共有2911011人', 6)

三、正则表达式语法

1、匹配单个字符的语法

.(点)通配符
可以匹配除了\n之外的任意一个字符

import re
re_obj = re.compile(".")
res = re_obj.match("asd")
print(res)#<_sre.SRE_Match object; span=(0, 1), match='a'>
#需求,匹配点仅表示英文符号下的句号,不表示其他,我们可以加\
import re
re_obj = re.compile("\.")
res = re_obj.match(".")
res2 = re_obj.match("r")
print(res)#<_sre.SRE_Match object; span=(0, 1), match='.'>
print(res2)#None

2、区间匹配——列举

匹配区间内包含的任意一个 字符
[]区间用中括号表示
如果是连续的数据可以用横线连接
如果是非连续的,需要以一一列举出来
[0-9] 0-9中任意一个数字
[a-zA-Z]英文字符中的任意一个
[0-9a-zA-z_]数字字母下划线任意一个
[a-cmpk] abcmpk中的任意一个
[^abc]除了abc之外的任意一个字符
/]加减乘除
[a-z]
小写字母连续出现任意个
**注:在程序中\==\\
\d转义的话是用\\转义----》\\\\
为了保证\就是\ 所以会在字符串前面加r
建议 以后写正则表达式 加上r修饰

3、利用特殊符号表示任意一个字符

\d表示0-9中任意一个字符[0-9]
\D[^0-9]表示以0-9中任意一个字符开头
\w字母、数字、下划线和汉字中的任意一个
\W非字母数字下划线、汉字中的任意一个
\s表示任意空白字符中的一个
\S非任意空白字符中的一个
#案例:用\d匹配\d
import re
re_obj = re.compile("..")
res = re_obj.match("\d")
print(res)
print(res.group())
re_obj2 = re.compile("\\"+res.group())
res2 = re_obj2.match("\d")
print(res2)

执行结果如下:

<_sre.SRE_Match object; span=(0, 2), match='\\d'>
\d
<_sre.SRE_Match object; span=(0, 2), match='\\d'>

4、正则语法的限制修饰

5、量词符号

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>我的个人博客生成器</title> <style> /* 页面基础样式 */ body { font-family: 'Microsoft YaHei', Arial, sans-serif; margin: 0; padding: 20px; background-color: #f5f5f5; } /* 容器样式 - 左右布局 */ .container { display: flex; gap: 20px; max-width: 1200px; margin: 0 auto; } /* 输入区域样式 */ .input-area, .output-area { flex: 1; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } /* 文本区域样式 */ textarea { width: 100%; height: 300px; padding: 15px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; line-height: 1.5; resize: vertical; box-sizing: border-box; } /* 提交按钮样式 */ input[type="submit"] { background-color: #0077cc; color: white; padding: 12px 30px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; transition: background-color 0.3s; } input[type="submit"]:hover { background-color: #005fa3; } /* 预览iframe样式 */ iframe { width: 100%; height: 400px; border: 1px solid #ccc; border-radius: 4px; background: white; } /* 标签样式 */ .tag { display: inline-block; background-color: #e0e0e0; color: #555; padding: 4px 12px; margin: 2px; border-radius: 15px; font-size: 0.8em; text-decoration: none; } .tag:hover { background-color: #d0d0d0; } /* 详情展开样式 */ details { margin-top: 20px; background: #f9f9f9; padding: 15px; border-radius: 4px; } summary { cursor: pointer; font-weight: bold; color: #0077cc; } pre { background: #2d2d2d; color: #f8f8f2; padding: 15px; border-radius: 4px; overflow-x: auto; font-size: 12px; } h1 { text-align: center; color: #333; margin-bottom: 30px; } h3 { color: #555; border-bottom: 1px solid #eee; padding-bottom: 10px; } </style> </head> <body> <h1>🎨 我的个人博客生成器</h1> <div class="container"> <!-- 左侧输入区 --> <div class="input-area"> <form method="POST"> <h3>📝 请输入你的博客内容:</h3> <textarea name="blog_content" placeholder="在这里写下你的博客内容...例如: 今天发现了一个很棒的学习网站,https://www.php.net,这里有最权威的PHP文档。 还找到了一个不错的编程社区:https://stackoverflow.com 在这里可以找到各种编程问题的答案。 #PHP #编程学习 #Web开发 今天学习了字符串处理和正则表达式,感觉对文本处理有了新的认识。函数封装让代码更加模块化,易于维护。 期待后续学习更多有趣的知识!"><?php // 在文本区域中显示之前提交的内容,使用htmlspecialchars防止XSS攻击 if(isset($_POST['blog_content'])) { echo htmlspecialchars($_POST['blog_content']); } ?></textarea> <br><br> <input type="submit" value="🚀 生成博客!"> </form> </div> <!-- 右侧输出区 --> <div class="output-area"> <h3>👀 生成的博客预览:</h3> <?php /** * 任务1:将文本中的URL地址转换为可点击的HTML链接 * @param string $text 原始文本 * @return string 处理后的文本(包含HTML链接) */ function makeClickableLinks($text) { // 使用正则表达式匹配以http://或https://开头的URL // 正则表达式说明:/(https?:\/\/[^\s]+)/ // - `https?`:匹配 http 或 https(s?表示s出现0次或1次) // - `:\/\/`:匹配 :// // - `[^\s]+`:匹配一个或多个非空格的字符 $pattern = '/(https?:\/\/[^\s]+)/'; // 替换模式:将匹配到的URL用<a>标签包裹起来 // `$1` 是对正则中第一个括号内匹配到的内容的引用,即完整的URL $replacement = '<a href="$1" target="_blank" style="color: #0077cc; text-decoration: none;">$1</a>'; // 使用preg_replace函数执行正则替换 return preg_replace($pattern, $replacement, $text); } /** * 任务2:将文本中的标签(如#PHP)格式化为带样式的Span元素 * @param string $text 原始文本 * @return string 处理后的文本(包含格式化后的标签) */ function formatHashtags($text) { // 使用正则表达式匹配以#开头、后跟一个或多个字母/数字/下划线的标签 // 正则表达式说明:/#(\w+)/ // - `#`:匹配字符# // - `\w+`:匹配一个或多个字母、数字或下划线 $pattern = '/#(\w+)/'; // 替换模式:将匹配到的标签用<span>标签包裹,并添加一个CSS类`tag` // `$1` 是对正则中第一个括号内匹配到的内容的引用,即`#`后面的文字(如PHP) $replacement = '<span class="tag">#$1</span>'; // 使用preg_replace函数执行正则替换 return preg_replace($pattern, $replacement, $text); } /** * 任务3:将处理好的博客内容包装成一个完整的HTML页面 * @param string $content 已经过URL和标签处理的博客正文 * @return string 完整的HTML页面代码 */ function wrapBlogContent($content) { // 使用date函数获取当前日期,并格式化为"年-月-日"的形式 $currentDate = date("Y年m月d日"); // 使用nowdoc语法定义一个多行字符串,用于构建完整的HTML // 这种语法非常适合编写大段的、内嵌HTML的字符串 $html = <<<'HTML' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>我的生成博客</title> <style> body { font-family: 'Microsoft YaHei', sans-serif; line-height: 1.6; padding: 40px; max-width: 800px; margin: 0 auto; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; } .blog-container { background: white; padding: 40px; border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,0.2); } .blog-title { color: #333; border-bottom: 3px solid #667eea; padding-bottom: 15px; margin-bottom: 20px; } .blog-date { color: #666; font-size: 0.9em; margin-bottom: 30px; padding: 10px; background: #f8f9fa; border-radius: 5px; } .blog-content { margin-top: 20px; font-size: 16px; } .blog-content p { margin-bottom: 20px; } .tag { display: inline-block; background: linear-gradient(135deg, #667eea, #764ba2); color: white; padding: 5px 15px; margin: 5px; border-radius: 20px; font-size: 0.8em; font-weight: bold; } a { color: #667eea; text-decoration: none; font-weight: bold; } a:hover { text-decoration: underline; } </style> </head> <body> <div class="blog-container"> <h1 class="blog-title">✍️ 我的博客随笔</h1> <p class="blog-date">📅 发布日期: HTML; // 拼接日期 $html .= $currentDate . '</p>'; // 拼接内容 $html .= '<div class="blog-content">' . nl2br($content) . '</div>'; // 闭合标签 $html .= '</div></body></html>'; // 返回最终生成的完整HTML字符串 return $html; } // 检查是否是POST请求并且有博客内容 if ($_SERVER["REQUEST_METHOD"] == "POST" && !empty($_POST['blog_content'])) { // 获取原始博客内容 $originalContent = $_POST['blog_content']; echo "<h4>✅ 处理流程:</h4>"; echo "<ol>"; echo "<li>原始内容长度: " . strlen($originalContent) . " 字符</li>"; // !!!核心处理流程!!! // 步骤1:调用函数,转换URL为链接 $contentWithLinks = makeClickableLinks($originalContent); echo "<li>已识别并转换URL链接</li>"; // 步骤2:调用函数,格式化标签 $formattedContent = formatHashtags($contentWithLinks); echo "<li>已格式化标签</li>"; // 步骤3:调用函数,将最终内容包装成完整HTML页面 $finalBlogHTML = wrapBlogContent($formattedContent); echo "<li>已生成完整HTML页面</li>"; echo "</ol>"; // 在预览区域显示生成的博客 echo "<h4>🎯 博客预览:</h4>"; echo "<iframe srcdoc=\"" . htmlspecialchars($finalBlogHTML) . "\" title=\"博客预览\"></iframe>"; // 显示生成的HTML源代码,供调试学习 echo "<details>"; echo "<summary>🔍 查看生成的HTML源码</summary>"; echo "<pre>" . htmlspecialchars($finalBlogHTML) . "</pre>"; echo "</details>"; } elseif ($_SERVER["REQUEST_METHOD"] == "POST") { // 如果提交了表单但内容为空 echo "<div style='color: #d32f2f; background: #ffebee; padding: 15px; border-radius: 4px;'>"; echo "⚠️ 请输入博客内容后再点击生成按钮!"; echo "</div>"; } else { // 首次访问页面时的提示 echo "<div style='color: #666; text-align: center; padding: 40px;'>"; echo "<p>👆 请在左侧输入你的博客内容,然后点击生成按钮</p>"; echo "<p>✨ 系统会自动:</p>"; echo "<ul style='text-align: left; display: inline-block;'>"; echo "<li>将网址转换为可点击链接</li>"; echo "<li>格式化 #标签 为美观样式</li>"; echo "<li>生成完整的博客页面</li>"; echo "</ul>"; echo "</div>"; } ?> </div> </div> </body> </html>一、基于补充的“个人博客生成器”项目,执行进阶版任务,具体任务要求: 在原来“博客预览”的下方,新增一个“博客内容分析报告”区域。学生需要编写新的函数,实现以下四个核心统计功能: 统计基础信息:总字符数、总单词数、预计阅读时间。 统计标签数量:识别并统计文章中使用了多少个#标签。 统计链接数量:识别并统计文章中包含了多少个http/https链接。 关键词高亮:让用户输入一个自定义关键词(如“PHP”),并在原文中高亮显示它。 WEB页面样式不限; 二、任务要点: 1、创建统计函数:创建至少3个新的自定义函数来完成统计。 getBasicStats($text): 统计字符数、单词数,并计算阅读时间(假设每分钟阅读200个单词)。 countHashtags($text): 使用正则表达式统计并返回所有#标签的数量和列表。 countLinks($text): 使用正则表达式统计文本中http/https链接的数量。 2、实现关键词高亮:在左侧表单中新增一个文本输入框,用于让用户输入想要高亮的关键词。 编写一个 highlightKeyword($text, $keyword) 函数,使用字符串替换功能,将文中所有的关键词替换为 <mark style="background-color: yellow;">$keyword</mark>。 3、整合与显示: 在生成博客后,调用这些统计函数。 将统计结果以清晰、美观的格式显示在“博客预览”区域下方。 三、关键知识点提示: 字符串函数:strlen(), str_word_count(), str_ireplace() 正则表达式:preg_match_all() 这是完成统计的关键匹配步骤。 自定义函数:如何设计函数接收参数并返回结果。 表单处理:如何获取新增的输入框的值 ($_POST['keyword'])。输出修改后的完整代码
11-28
源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值