删除具有正则表达式的版本号



我想在字符串中替换版本号,例如

Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148 9.0.30729.4148
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 9.0.30729.6161
Microsoft_VC80_DebugCRT_x86_x64 1.0.0
Microsoft_VC80_DebugCRT_x86 1.0.0
Windows UPnP Browser 0.1.01
CamStudio
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148 9.0.30729.4148
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 9.0.30729.6161
Microsoft_VC80_DebugCRT_x86_x64 1.0.0
Microsoft_VC80_DebugCRT_x86 1.0.0

我希望它成为

Microsoft Visual C++ 2008 Redistributable - x86 
Microsoft Visual C++ 2008 Redistributable - x86 
Microsoft_VC80_DebugCRT_x86_x64 
Microsoft_VC80_DebugCRT_x86 
Windows UPnP Browser
CamStudioe 
Microsoft Visual C++ 2008 Redistributable - x86 
Microsoft Visual C++ 2008 Redistributable - x86 
Microsoft_VC80_DebugCRT_x86_x64 
Microsoft_VC80_DebugCRT_x86 

以下是我的代码

s="MicrosoftVisualC++2008Redistributable-x86nMicrosoftVisualC++2008Redistributable-x86nMicrosoft_VC80_DebugCRT_x86_x64nMicrosoft_VC80_DebugCRT_x86nWindowsUPnPBrowsernCamStudioenMicrosoftVisualC++2008Redistributable-x86nMicrosoftVisualC++2008Redistributable-x86nMicrosoft_VC80_DebugCRT_x86_x64nMicrosoft_VC80_DebugCRT_x86"
s1=s.replace('r','').split('n')
s2=[]
for s in s1:
    m = re.search('(?<=([ ]+[.d]*)*$)', s)
    s2.append(m.group(0))
print(s2)

我有问题

error: look-behind requires fixed-width pattern

有更好的方法来完成此任务吗?

诀窍是,您可以将模式中未返回的事物(即,它们将成为组(0)组的一部分,但没有其他组)。这是我解决的问题:

# put the lines to clean in a string
s='''Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148 9.0.30729.4148
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 9.0.30729.6161
Microsoft_VC80_DebugCRT_x86_x64 1.0.0
Microsoft_VC80_DebugCRT_x86 1.0.0
Windows UPnP Browser 0.1.01
CamStudio
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148 9.0.30729.4148
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 9.0.30729.6161
Microsoft_VC80_DebugCRT_x86_x64 1.0.0
Microsoft_VC80_DebugCRT_x86 1.0.0'''
# use findall to return the parts we want
print(re.findall(r'(.+?)(?: (?:[d.]+))*(?:n|Z)', s))

以下的解释:(.+?)是一堆字符的非怪兽捕获。
(?: [d.]+)*是一个非捕获组,重复零或更多次,从一个空间开始,只有数字或'。以下(每次重复)。
(?:n|Z)匹配新线或字符串的末端。如果您的字符串可能具有返回马车,则可以使用r?(?:n|Z)

对于只有一个捕获组的正则ggex, re.findall返回字符串中每个匹配的组(1),这正是您想要的。正则表达式的其他部分必须匹配,但是由于未捕获它们,因此不会返回。

最新更新