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

如何修改Python正则表达式以正确提取带++的Winget包ID?

提取Winget包ID时修复特殊字符截断问题

问题根源

你之前的正则表达式应该依赖了 \w(仅匹配字母、数字、下划线),但Winget包ID允许包含 + 这类特殊符号,\w 不会匹配它们,所以提取 Notepad++.Notepad++ 时,会在遇到第一个 + 时停止匹配,只得到 Notepad++.Notepad。

修正方案

直接扩展匹配范围,包含包ID允许的所有字符(字母、数字、点、加号、连字符、下划线):

import re

# 匹配Winget包ID的正则
package_id_pattern = r'([a-zA-Z0-9._+-]+)'

# 示例文本行
winget_line = "Notepad++ Notepad++.Notepad++ 8.5.6 8.6.0 winget"
match_result = re.search(package_id_pattern, winget_line)

if match_result:
    print(match_result.group(1))  # 输出完整的 Notepad++.Notepad++

更精准的匹配(针对Winget输出格式)

如果文本是标准Winget upgrade输出格式(包名、ID、当前版本、新版本、来源),可以用更精准的正则定位ID列,避免误匹配其他字段:

# 匹配格式:[包名] [包ID] [当前版本] [新版本] [来源]
package_id_pattern = r'\s+([a-zA-Z0-9._+-]+)\s+[\d.]+\s+[\d.]+\s+winget'

match_result = re.search(package_id_pattern, winget_line)
if match_result:
    print(match_result.group(1))

多行文本测试

用实际Winget输出片段验证:

sample_upgrade_output = """
Notepad++ Notepad++.Notepad++ 8.5.6 8.6.0 winget
Microsoft.VisualStudioCode 1.85.1 1.86.0 winget
GitHub.GitLFS 3.3.0 3.4.0 winget
"""

for line in sample_upgrade_output.strip().split('\n'):
    match = re.search(r'\s+([a-zA-Z0-9._+-]+)\s+', line)
    if match:
        print(match.group(1))

这段代码会正确输出所有包ID,包括带 ++ 的Notepad++.Notepad++。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:57:52