我是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)以及我不知道如何elimate')'的paranthesis ..在这里需要一些帮助..
由于 -Vijay
答案 0 :(得分: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
答案 1 :(得分: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 :(得分: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
答案 3 :(得分: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'
答案 4 :(得分:1)
具体来说,对于SDK版本,。*对于你想要的东西来说太宽泛了 - 它匹配所有东西,所以它将匹配整个字符串的其余部分。您可以使用正则表达式主体“SDK([0-9。] +)”然后获取第一个组。 (“[0-9。] +”将匹配一串数字字符和句点。)
对于版本字符串,您可以匹配“Version:([a-bA-B0-9 - ] +)”(“并取第一组 - 这表示您正在寻找由字母数字字符和连字符,后跟空格和开放式字符。
答案 5 :(得分:1)
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"
。