识别版本号的正则表达式 - Python

1 投票
1 回答
1266 浏览
提问于 2025-04-16 23:16

我需要在文本中找到并替换版本号,用一个通用的占位符,比如说'*'。

问题是我不知道怎么写正则表达式来捕捉这些版本号。


这里有一些例子:

Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.825.0 Chrome/14.0.825.0 Safari/535.1

Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc

Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 (.NET CLR 3.5.30729)

版本号包含:

  • 字母和数字
  • 特殊字符,比如'.-_:'

一个简单的正则表达式可能是 r'[0-9._:-]+',但是这样不行,因为版本号至少需要有一个字母或数字,并且在字母或数字之间要有特殊字符。


有没有什么好主意?

1 个回答

1

在re模块中,可以使用sub函数。这个函数会返回一个字符串,其中所有符合输入的正则表达式的部分都会被一个函数的输出或者一个简单的字符串替换掉。问题在于你需要确定每个字符串中哪些版本号是你想要替换的。我假设你是想替换所有的版本号。

import re
data = ["Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.825.0 Chrome/14.0.825.0 Safari/535.1",
"Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-PT; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7 (.NET CLR 3.5.30729)"]
output = []
for str in data:
   output.append(re.sub(r'\d[0-9a-zA-Z._:-]+', '*', str))
print output

这样会得到这些结果:

['Mozilla/* (X*; Linux i*) AppleWebKit/* (KHTML, like Gecko) Ubuntu/* Chromium/* Chrome/* Safari/*', 
'Mozilla/*(iPad; U; CPU iPhone OS * like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Version/* Mobile/* Safari/*',
'Mozilla/* (Windows; U; Windows NT *; pt-PT; rv:*) Gecko/* Firefox/* (.NET CLR *)']

这个正则表达式不是很好,我想要的是一组重复的字母数字字符后面跟着一个分隔符。但我似乎无法让它正常工作。类似于 ([0-9a-zA-Z]+[._:-])+ 这样的形式。

撰写回答