Python的正则表达式万能匹配符 (.*?) 失效的情况和解决办法

正则表达式的万能匹配符 (.*?) 很好用,但有时会失效。本文将探讨这种情况以及解决办法。

问题描述

当处理以下字符串时:

s = '写入:name=miko, id=77286, pid=003-641, uuid=54afea8710ace146, time=1714812841346'

我尝试使用正则表达式提取 idpiduuidtime 的值:

import re

id = re.search('id=(.*?)', s)[1]
pid = re.search('pid=(.*?)', s)[1]
uuid = re.search('uuid=(.*?)', s)[1]
timestamp = re.search('time=(.*?)', s)[1]
print(id, pid, uuid, timestamp)

然而,上述代码的运行结果为空。
究其原因,是因为 (.*?) 匹配的是非贪婪模式,但如果后面没有明确的结束标记,它可能匹配到空字符串。

解决办法

方法一:使用明确的结束标记

由于 idpiduuid 等字段后面都有逗号,可以在正则表达式中加上逗号:

id = re.search('id=(.*?),', s)[1]
pid = re.search('pid=(.*?),', s)[1]
uuid = re.search('uuid=(.*?),', s)[1]
print(id, pid, uuid)
# 输出:77286 003-641 54afea8710ace146
方法二:使用字符集排除法

可以使用字符集排除法,即匹配任何不包含空格和逗号的连续字符序列:

id = re.search(r'id=([^\s,]+)', s)[1]
pid = re.search(r'pid=([^\s,]+)', s)[1]
uuid = re.search(r'uuid=([^\s,]+)', s)[1]
print(id, pid, uuid)
# 输出:77286 003-641 54afea8710ace146

解释:

  • [^\s,]+ 匹配任何不包含空格和逗号的连续字符序列。
  • [^ ]:方括号表示一个字符集合,这里表示匹配方括号内的任何一个字符。
  • ^:插入符号在方括号内表示取反,即不包含方括号内列出的字符。
  • \s:表示任何空白字符,包括空格、制表符、换行符等。
  • ,:逗号字符本身。

获取 time 后面的数字

上面很好地解决了匹配 id、pid、uuid后面的字符串问题,因为它们都有明确的逗号作为分隔符,而对于获取 time 后面的数字,没有明显的分隔符,怎么办?下面有几种解决方式:

方法一:匹配到字符串结尾
timestamp = re.search(r'time=(.*?)$', s)[1]
# $ 表示匹配到结尾
print(timestamp)
# 输出:1714812841346
方法二:匹配数字
timestamp = re.search(r'time=(\d+)', s)[1]
# 匹配数字
print(timestamp)
# 输出:1714812841346
方法三:使用字符集排除法
timestamp = re.search(r'time=([^\s,]+)', s)[1]
# 匹配不含空格和逗号的连续字符序列
print(timestamp)
# 输出:1714812841346

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-25 20:12:26       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-25 20:12:26       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-25 20:12:26       87 阅读
  4. Python语言-面向对象

    2024-05-25 20:12:26       96 阅读

热门阅读

  1. 邦芒面试:面试礼仪细节大揭秘

    2024-05-25 20:12:26       32 阅读
  2. Bitmap 的基本原理

    2024-05-25 20:12:26       30 阅读
  3. 共享内存bug

    2024-05-25 20:12:26       30 阅读
  4. leensa邀请码

    2024-05-25 20:12:26       34 阅读
  5. es索引同步

    2024-05-25 20:12:26       29 阅读
  6. Hadoop 再探讨

    2024-05-25 20:12:26       27 阅读
  7. Django rest_framework 基础应用

    2024-05-25 20:12:26       29 阅读
  8. P2P 技术:点对点网络的兴起

    2024-05-25 20:12:26       29 阅读
  9. Android 录音AudioRecord

    2024-05-25 20:12:26       35 阅读
  10. 【Python】—— 推导式

    2024-05-25 20:12:26       32 阅读