You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python3中使用正则表达式提取指定字符串中的对应值?

解决方案

这里有个可行的Python正则方案,能精准提取你要的键值对字典:

import re

string = "# Combinations selected:Mod Size 1024 with SHA-1(Salt len: 20); SHA-224(Salt len: 20); SHA-256(Salt len: 20); SHA-384(Salt len: 20); SHA-512(Salt len: 20);; Mod Size 2048 with SHA-1(Salt len: 20); SHA-224(Salt len: 28); SHA-256(Salt len: 32); SHA-384(Salt len: 48); SHA-512(Salt len: 64);; Mod Size 3072 with SHA-1(Salt len: 0); SHA-224(Salt len: 0); SHA-256(Salt len: 0); SHA-384(Salt len: 24); SHA-512(Salt len: 0); "

# 先移除开头的固定前缀
cleaned_string = string.replace('# Combinations selected:', '')

# 正则模式:匹配每个Mod Size块的键和对应的哈希列表
pattern = r'(Mod Size \d+) with (.*?)(?=;;|$)'
# 使用re.DOTALL让.匹配换行符(兼容可能的多行输入)
matches = re.findall(pattern, cleaned_string, re.DOTALL)

# 构建字典,同时清理值末尾多余的分号和空格
result = {}
for key, value in matches:
    cleaned_value = value.rstrip('; ').strip()
    result[key] = cleaned_value

print(result)

代码说明

  1. 前缀清理:先把开头的# Combinations selected:去掉,避免干扰正则匹配。
  2. 正则逻辑:
    • (Mod Size \d+):捕获键部分,精准匹配"Mod Size"加数字的格式。
    • with :匹配键和哈希列表之间的固定分隔文本。
    • (.*?):非贪婪匹配任意字符,这是关键——避免把后面的其他Mod Size块也包含进来。
    • (?=;;|$):正向预查,指定匹配终止条件:要么遇到;;(块之间的分隔符),要么到字符串结尾。
    • re.DOTALL:让.能匹配换行符,即使你的输入是多行也能正常工作。
  3. 值清理:用rstrip('; ')去掉哈希列表末尾多余的分号和空格,让结果更整洁。

运行这段代码后,你会得到完全符合预期的字典:

{
    'Mod Size 1024': 'SHA-1(Salt len: 20); SHA-224(Salt len: 20); SHA-256(Salt len: 20); SHA-384(Salt len: 20); SHA-512(Salt len: 20)',
    'Mod Size 2048': 'SHA-1(Salt len: 20); SHA-224(Salt len: 28); SHA-256(Salt len: 32); SHA-384(Salt len: 48); SHA-512(Salt len: 64)',
    'Mod Size 3072': 'SHA-1(Salt len: 0); SHA-224(Salt len: 0); SHA-256(Salt len: 0); SHA-384(Salt len: 24); SHA-512(Salt len: 0)'
}

为什么之前的尝试可能失败?

大概率是因为用了贪婪匹配(比如直接用.*而不是.*?),导致正则会从第一个Mod Size一直匹配到字符串末尾,而不是停在块分隔符;;处。另外,如果没处理开头的前缀,也可能让匹配逻辑混乱。

内容的提问来源于stack exchange,提问作者satya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:27:31