4

我是 python 的新手,在使用正则表达式方面需要一些帮助。

我有一个这样的字符串:

新版本可用版本:20120418-abcdef-1(基于 SDK 0.0.0.1)

从上面的字符串中,我想使用正则表达式提取以下文本

20120418-abcdef-1 0.0.0.1

我可以通过拆分来做到这一点,但我觉得这是一种无效的方式。我尝试使用正则表达式,但无法缩小范围。

例如,我用

sdk_version = re.search(r"SDK(.*)", lines,)
                    print sdk_version.group(1)

但这给出了版本 0.0.0.1) 以及我不知道如何删除 ')' 的括号 .. 在这里需要一些帮助..

谢谢-维杰

4

6 回答 6

2

好的,我不知道您的所有字符串是否与提供的完全一样,但是您提供的确切字符串的正则表达式将是:

: (.*) \(based on SDK (.*)\)

这将执行以下操作:

: - 出现 : 后开始匹配。

( - 这将打开一个组(这是正则表达式的特殊构造,允许您稍后引用捕获的值)。

.* - 这部分只是匹配所有内容,直到一个空格。

\( - 这将匹配一个“真正的”大括号,而不是打开一个子组。

\) - 这将匹配一个“真正的”右大括号,而不是关闭一个子组。

所以在python这看起来像这样:

import re
s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
r = re.compile(r": (.*) \(based on SDK (.*)\)")
m = r.search(s)
m.groups()
>> ('20120418-abcdef-1', '0.0.0.1')
于 2012-04-18T18:46:00.063 回答
2
>>> s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
>>> import re
>>> version = re.compile(r"(?<=Version: )\d*-[a-z]*-\d")
>>> version.search(s).group()
'20120418-abcdef-1'

这匹配

(preceded by "Version: ")
a string of digits
hyphen
a string of lowercase letters
hyphen
a digit

相似地,

>>> subversion = re.compile(r"(?<=SDK )\d*.\d*.\d*.\d*")
>>> subversion.search(s).group()
'0.0.0.1'

火柴

(preceded by "SDK ")
a string of digits
a dot
a string of digits
a dot
a string of digits
a dot
a string of digits
于 2012-04-18T18:39:28.120 回答
2

假设版本号只能包含字母、数字、点和破折号,这就是你所需要的:

version, sdk = re.findall(r'(?:Version: |SDK )([\w.-]+)', s)

例子:

s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"

import re
version, sdk = re.findall(r'(?:Version: |SDK )([\w.-]+)', s)

print version
print sdk

## 20120418-abcdef-1
## 0.0.0.1
于 2012-04-18T19:21:32.000 回答
1

@Gjallar 已经写了一个很好的答案。这是对他的回答的轻微调整:

import re
s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
r = re.compile(r":\s+(.*)\s+\(based on SDK\s+(\S+)\s*\)")
m = r.search(s)
m.groups()
>> ('20120418-abcdef-1', '0.0.0.1')

在他有空格的几个地方,我将其替换为\s+匹配一个或多个任何类型的空白。因此,如果那里有一个额外的空间,或者一个选项卡,或者其他什么,这仍然会匹配。

同样,我更改了 SDK 字符串的模式。首先,我将它从 更改.*\S+,所以它现在只匹配非空白字符,而不是匹配任何内容,并且必须至少有一个。我还添加\s*了匹配零个或多个任何类型的空白。如果没有空格,这将无济于事,但如果有一些,它将匹配它;但它在括号之外,所以它不会捕获空白。因此,SDK 字符串将匹配但不包含任何空格:

s = "New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1 )"

使用@Gjallar 的原始模式,SDK 字符串将是"0.0.0.1 ",但使用我的模式,你仍然会得到"0.0.0.1".

于 2012-04-18T19:07:39.583 回答
1

可能你可能想做

>>> st="New builds available Version: 20120418-abcdef-1 (based on SDK 0.0.0.1)"
>>> "".join(re.findall(":[ ]*(.*?)[ ]*\(.*SDK(.*)\)",st)[0])
'20120418-abcdef-1 0.0.0.1'
于 2012-04-18T18:38:40.510 回答
1

特别是对于 SDK 版本, .* 对于您想要的内容来说太宽泛了——它匹配所有内容,因此它将匹配整个字符串的其余部分。您可以使用正则表达式主体“SDK ([0-9.]+)”,然后取第一组。(“[0-9.]+”将匹配一串数字字符和句点。)

对于版本字符串,您可以匹配类似 "Version: ([a-bA-B0-9-]+) (" 并获取第一组 - 这表示您正在寻找由字母数字字符组成的字符串,并且连字符,后跟一个空格和一个左括号。

于 2012-04-18T18:38:55.093 回答