python正则表达式两者取一的表达

本文介绍了一种使用正则表达式准确匹配MAC地址的方法。针对MAC地址可能采用冒号或破折号分隔的特点,文章详细解释了如何避免错误匹配,并提供了一个修正后的正则表达式示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

曾经要用正则表达式从.txt或者.dat文本中寻找mac的地址的办法
目标数据 2a:3v:5g:3k:3d:6h或者2a-3v-5g-3k-3d-6h
可能是由于是16进制,字母不允许大于f。英文字符无视大小写。

一开始的错误代码
"[a-fA-F0-9]{2}[:-][a-fA-F0-9]{2}[:-][a-fA-F0-9]{2}[:-][a-fA-F0-9]{2}[:-][a-fA-F0-9]{2}[:-][a-fA-F0-9]{2}"

由于这个正则表达式能抓取一些错误的例子。

举例

输入: 2a-3v:5g-3k:3d:6h
输出: 2a-3v:5g-3k:3d:6h
会出现":“与”-"混用的例子,这些是错误的例子。由于输出的顺序必须和文本出现的顺序一致,所以不能分开来查找,于是就做了如下的修改。

"(?:[a-fA-F0-9]{2}[:][a-fA-F0-9][:][a-fA-F0-9]{2}[:][a-fA-F0-9]{2}[:][a-fA-F0-9]{2}[:][a-fA-F0-9]{2}|[a-fA-F0-9]{2}[-][a-fA-F0-9][-][a-fA-F0-9]{2}[-][a-fA-F0-9]{2}[-][a-fA-F0-9]{2}[-][a-fA-F0-9]{2})"

其中(?:: |-)表示的是两种只能有一种。要不就是全部:衔接的,要不就是全部-衔接的mac地址表达式。

### 通配符与正则表达式的区别及用法 #### 区别概述 通配符和正则表达式虽然都用于模式匹配,但在复杂度、用途和适用场景上有显著差异。通配符通常用于文件名匹配或简单字符串筛选,而正则表达式提供更强大的功能,适用于复杂的文本处理需求。 --- #### 、定义与背景 - **通配符**是种简单的模式匹配工具,主要用于操作系统中的文件路径匹配或其他有限范围的字符串操作[^3]。 - **正则表达式**是套更为灵活的语言描述方式,广泛应用于编程语言中进行字符串查找、验证、提等功能[^2]。 --- #### 二、语法特点对比 ##### 1. 通配符的常见符号及其含义 | 符号 | 含义 | |------|------| | `*` | 匹配零个或多个字符[^4]。 | | `?` | 匹配单个任意字符[^3]。 | | `[abc]` | 匹配方括号内的任字符(如 a, b 或 c)[^3]。 | 示例: ```bash ls *.txt # 列出当前目录下所有以 .txt 结尾的文件 find /path -name "??.log" # 查找根目录下的两个字符长度并以.log结尾的文件 ``` ##### 2. 正则表达式的常用元字符 正则表达式支持更加丰富的语法规则,包括但不限于以下内容: | 元字符/结构 | 描述 | |-------------------|----------------------------------------------------------------------------------------| | `\.` | 匹配个点字符本身,而非任何字符[^1]。 | | `^` | 表示行首锚定[^4]。 | | `$` | 表示行尾锚定。 | | `+` | 匹配前面的子表达次或多次。 | | `{n,m}` | 匹配前项至少 n 次但不超过 m 次。 | | `( )` | 定义捕获组,可以用来保存匹配的部分以便后续引用。 | | `|` | 表达逻辑“或”的关系。 | 示例代码展示如何利用正则表达式实现高级匹配: ```python import re pattern = r"^hello(\s+\w+)*$" # 使用正则表达式匹配以 hello 开头并可能跟随若干单词的字符串 test_string = "hello world again" match_result = re.match(pattern, test_string) if match_result: print("Matched:", match_result.group()) else: print("No Match") ``` --- #### 三、应用场景分析 - **通配符的应用** 主要集中在 Shell 脚本或者命令行环境中完成基本的任务自动化,例如批量重命名文件、过滤日志记录等。 - **正则表达式的应用** 更适合于开发环境下的数据清洗、格式校验等工作流当中。例如,在 Python 中可以通过模块 `re` 实现对电子邮件地址的有效性检测[^2]: ```python email_pattern = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$" emails_to_check = ["example@example.com", "invalid-email@"] valid_emails = [e for e in emails_to_check if re.search(email_pattern, e)] print(valid_emails) ``` --- #### 四、注意事项 无论是使用哪种技术手段都需要考虑其局限性和潜在风险。对于初学者来说,掌握好两者的基础知识非常重要;而对于开发者,则应根据实际项目需求合理选用合适的解决方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值