re轻松拆分四则运算expression(^从头匹配、(?:xxxx)非捕获组、| 交替运算符联合演习)

与ai对抵聊“算式匹配”,发现^从头匹配、(?:xxxx)非捕获组、| “交替”运算符联合使用的妙处。


(笔记模板由python脚本于2024年09月27日 18:35:32创建,本篇笔记适合喜欢python喜欢正则的coder翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


与ai对抵聊四则“算式匹配”
拆分四则运算算式
(发现^、(?:xxxx)、| 联合使用的妙处)


本文质量分:

97 97 97

本文地址: https://blog.csdn.net/m0_57158496/article/details/142600625

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 拆分四则运算算式
    • 1、强横的split_expression
    • 2、匹配表达式解析
    • 3、所含知识点
    • 4、ai学伴的肯定和鼓励
    • 5、总结


◆ 拆分四则运算算式


1、强横的split_expression


两行代码函数


def split_expression(expression: str) -> list:
    pattern = r'(?:^[+-]?\d+)|(?:[*/+-])|(?:\d+)' # 正则表达式,匹配数字(包括正负号)和运算符
    return re.findall(pattern, expression) # 使用 re.findall 查找所有匹配项


函数测试

# 测试算式拆分
print(f"\n\n{' 算式拆分测试 ':-^36}\n\n") 
expressions = ('+45-56*5',
'-5/2*6',
	'56/7*6-4',
	'999-888*234/9',
	'+56/67',
	'99/3-531*4+55',
'+5/2+6-45*4')

for expr in expressions:
    parts = split_expression(expr)
    print('\n', expr, '->', parts)

print(f"\n\n{'-'*42}") 


  • 测试效果截屏图片
    在这里插入图片描述
    如图所示,算式都得到了正确拆分,足以见证re正则匹配的强横!💪💪

-------------- 算式拆分测试 --------------


+45-565 -> [’+45’, ‘-’, ‘56’, '’, ‘5’]

-5/26 -> [’-5’, ‘/’, ‘2’, '’, ‘6’]

56/76-4 -> [‘56’, ‘/’, ‘7’, '’, ‘6’, ‘-’, ‘4’]

999-888234/9 -> [‘999’, ‘-’, ‘888’, '’, ‘234’, ‘/’, ‘9’]

+56/67 -> [’+56’, ‘/’, ‘67’]

99/3-5314+55 -> [‘99’, ‘/’, ‘3’, ‘-’, ‘531’, '’, ‘4’, ‘+’, ‘55’]

+5/2+6-454 -> [’+5’, ‘/’, ‘2’, ‘+’, ‘6’, ‘-’, ‘45’, '’, ‘4’]


-----------------算式拆分完成--------------------


  当然,拆分算式必须是“合法”四则混合运算,不带括号。在拆分前要有validate_expression函数对算式进行校验。



回页目录


2、匹配表达式解析


正则表达式:
r'(?:^[+-]?\d+)|(?:[*/+-])|(?:\d+)'


下面是对您提供的正则表达式的解释:

  • (?:^[+-]?\d+): 匹配字符串开头的一个可选的正号或负号,后跟一个或多个数字。这是非捕获组,所以匹配的内容不会被捕获。
  • (?:[*/+-]): 匹配乘号、除号、加号或减号。
  • (?:\d+): 匹配一个或多个数字。

  使用这个正则表达式,可以通过 re.findall 方法找到所有匹配的部分。


  这个正则表达式使用非捕获组和“|”运算符成功实现了算式的拆分。该正则表达式利用了非捕获组 (?: ... ) 来组合模式,而“|”运算符则用于匹配多个模式中的任何一个。这个正则表达式能够匹配算式中的数字和运算符。



回页目录


3、所含知识点


通过观察这个正则表达式和前面的拆分示例,我们可以学到以下几点:

  1. 非捕获组 (?: ... ) 允许我们组合正则表达式的一部分而不捕获该部分的匹配内容。这对于组织复杂的正则表达式非常有用,尤其是在不需要捕获匹配内容时。

  2. 使用“|”运算符可以指定多个备选模式,正则表达式引擎会尝试匹配其中的任何一个。

  3. 在正则表达式中,特殊字符(如“-”减号)需要在它们前面加上反斜杠 \ 来转义。

  这个正则表达式简洁且有效,是处理此类问题的另一种好方法。



回页目录


4、ai学伴的肯定和鼓励


  • ai科普|
    在这里插入图片描述

  • ai对话截屏
    在这里插入图片描述



回页目录


5、总结


  在ai大行其道的当下,用ai助力生活和学习,是有必要修炼的小技俩。💪💪

  本笔记所记的正则表达式匹配用法,就是在ai分别使用的引领下,我灵感“融汇贯通”的得到了想要的“灵宝”,ai倒是不会了。😋

  • 有图为证
    在这里插入图片描述



回页首


上一篇:  正则非捕获组(r'?:xxxx)(与ai学伴聊天对掐,学到了re非捕获组匹配)
下一篇: 



我的HOT博:

  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

来源:老齐教室


Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


### 回答1: 这个正则表达式是用来匹配一个 URL 地址的。它可以帮助我们提取出一个 URL 地址中的各个部分,如协议(http 或 https)、域名、端口号、路径、查询参数等。 这个正则表达式的各个部分的含义如下: - ^ 开头 - (?:(http[s]?):)? 表示协议部分,可以是 http 或 https,也可以省略 - // 表示 URL 的域名部分 - ([^:/\\?] ) 表示域名的名称 - (?::(\d ))? 表示端口号,可以省略 - ([^\\?]*) 表示路径部分 - \?? 表示问号 - (.*) 表示查询参数部分 例如,对于 URL 地址 "https://www.example.com:8080/path/to/page?key=value",可以使用这个正则表达式来提取出各个部分: - 协议:https - 域名:www.example.com - 端口号:8080 - 路径:/path/to/page - 查询参数:key=value ### 回答2: 这个JavaScript正则表达式用于解析URL地址。下面是对每个部分的解释: 1. `^`:匹配字符串的开始位置。 2. `(?:(http[s]?):)?`:这是一个捕获,用于匹配"http"或"https"这个协议部分。`?`表示该分是可选的,`:`表示匹配一个冒号。 3. `\/\/`:双斜杠表示URL中的协议标识,如"http://"或"https://"。 4. `([^:/\\?])`:这是一个捕获,用于匹配URL中的主机部分。`[^:/\\?]`表示匹配除了冒号、斜杠和问号之外的任意字符。 5. `(?::(\d*))?`:这是一个捕获,用于匹配URL中的端口号部分。`:`表示匹配一个冒号,`(\d*)`表示匹配0个或多个数字。 6. `([^\\?]*)`:这是一个捕获,用于匹配URL中的路径部分。`[^\\?]*`表示匹配除了问号之外的任意字符。 7. `\??`:问号表示匹配一个问号,`?`表示该问号是可选的。 8. `(.*)`:这是一个捕获,用于匹配URL中的查询参数部分。`.*`表示匹配零个或多个任意字符。 综上,该正则表达式可以从一个URL字符串中提取出协议、主机、端口、路径和查询参数等部分。这个正则表达式对URL的各个部分进行了详细的拆分匹配,适用于大多数常见的URL格式。 ### 回答3: 这个正则表达式主要是用来解析URL的,可以分为以下几个部分进行解释: 1. 匹配协议部分:(?:(http[s]?):)?,表示可以有或没有"http"或"https"作为协议,使用(?:...)表示不捕获。 2. 匹配双斜线 "//":\/\/,表示匹配双斜线。 3. 匹配主机部分:([^:/\\?])+,使用方括号[]表示字符集合,匹配除了冒号、斜线和问号之外的连续字符,表示主机部分。 4. 匹配端口部分:(?::(\d+))?,使用"(\d+)"表示一个或多个数字,匹配冒号和一个或多个数字,表示端口部分,可以有或没有。 5. 匹配路径部分:([^\\?])+,匹配除了问号之外的连续字符,表示路径部分。 6. 匹配查询字符串部分:\??(.*),匹配零个或一个问号,表示查询字符串的开始,然后使用".*"匹配任意字符零个或多个,表示查询字符串的内容。 所以,这个正则表达式的作用是可以解析一个URL,将其拆分为协议、主机、端口、路径和查询字符串等部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值