Python中的正则表达式用法

4

我是一个Python的新手,需要一些关于正则表达式用法的帮助。

我有一个字符串,像这样:

New builds available Version: 20120418-abcdef-1 (based on 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),括号我不知道该如何消除。需要一些帮助在这里...谢谢-Vijay
6个回答

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

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')

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

1

对于SDK版本,.*太宽泛了,不适合你在这里使用--它匹配所有内容,因此它将匹配字符串的其余部分。你可以使用正则表达式主体"SDK ([0-9.]+)",然后取第一组。("[0-9.]+"将匹配由数字字符和句点组成的字符串。)

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


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'

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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接