如何在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)
代码说明
- 前缀清理:先把开头的
# Combinations selected:去掉,避免干扰正则匹配。 - 正则逻辑:
(Mod Size \d+):捕获键部分,精准匹配"Mod Size"加数字的格式。with:匹配键和哈希列表之间的固定分隔文本。(.*?):非贪婪匹配任意字符,这是关键——避免把后面的其他Mod Size块也包含进来。(?=;;|$):正向预查,指定匹配终止条件:要么遇到;;(块之间的分隔符),要么到字符串结尾。re.DOTALL:让.能匹配换行符,即使你的输入是多行也能正常工作。
- 值清理:用
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
相关产品推荐
相关产品推荐

