Regex -显示/匹配字符串末尾包含一个或多个++的字符串

gblwokeq  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(152)

我有一个文本文件,其中包括不同的软件包(名称,id,当前版本,新版本,源代码)提取winget(winget升级)(我删除了前两行和最后一行)
文本文件的内容:

Brave                        Brave.Brave         111.1.49.120         111.1.49.128        winget
Git                          Git.Git             2.39.2               2.40.0              winget
Notepad++ (64-bit x64)       Notepad++.Notepad++ 8.5                  8.5.1               winget
Spotify                      Spotify.Spotify     1.2.7.1277.g2b3ce637 1.2.8.907.g36fbeacc winget
Teams Machine-Wide Installer Microsoft.Teams     1.5.0.30767          1.6.00.4472         winget
PDFsam Basic                 PDFsam.PDFsam       5.0.3.0              5.1.1.0             winget

我试图使用Python3过滤掉所有的包ID,因为winget upgrade的输出只是基于文本的。
到目前为止我已经尝试过:

import re

with open(r"C:\Users\Username\Desktop\winget_upgrade.txt", "r") as f:
    for line in f:
        match = re.search(r"\b([a-zA-Z]+[a-zA-Z0-9!@#$%^&*()+\-.]*\.[a-zA-Z]+[a-zA-Z0-9!@#$%^&*()+\-.]*\+*)\b", line)
        if match:
            print(match.group(1))

输出为:

Brave.Brave
Git.Git
Notepad++.Notepad
Spotify.Spotify
Microsoft.Teams
PDFsam.PDFsam

这里的问题是包记事本在末尾缺少两个+字符。我如何编辑我的正则表达式语法以成功显示:
notepad++.notepad++而不是notepad++.notepad
我想我必须在+过滤器上做些改变:()+\-.]*\+*)
但我不确定是什么。
你能帮帮我吗?

6rqinv9w

6rqinv9w1#

问题是由\b引起的,因为从+到空格的转换不是字边界。
使用先行(?=\s)代替:

import re

lines = [
'Brave                        Brave.Brave         111.1.49.120         111.1.49.128        winget',
'Git                          Git.Git             2.39.2               2.40.0              winget',
'Notepad++ (64-bit x64)       Notepad++.Notepad++ 8.5                  8.5.1               winget',
'Spotify                      Spotify.Spotify     1.2.7.1277.g2b3ce637 1.2.8.907.g36fbeacc winget',
'Teams Machine-Wide Installer Microsoft.Teams     1.5.0.30767          1.6.00.4472         winget',
'PDFsam Basic                 PDFsam.PDFsam       5.0.3.0              5.1.1.0             winget',
    ]

for line in lines:
    match = re.search(r"\b([a-zA-Z]+[a-zA-Z0-9!@#$%^&*()+\-.]*\.[a-zA-Z]+[a-zA-Z0-9!@#$%^&*()+\-.]*\+*)(?=\s)", line)
    if match:
        print(match.group(1))

输出:

Brave.Brave
Git.Git
Notepad++.Notepad++
Spotify.Spotify
Microsoft.Teams
PDFsam.PDFsam

相关问题