我是python的新朋友,在使用正则表达式方面需要一些帮助。
我有一个这样的字符串:
新版本可用 版本: 20120418-abcdef-1(基于 SDK 0.0.0.1)
从上面的字符串中,我想使用正则表达式提取以下文本
20120418-ABCDEF-10.0.0.1
我可以通过拆分来做到这一点,但我觉得这是一种无效的方法。我尝试使用正则表达式,但无法缩小范围。
例如,我用了
sdk_version = re.search(r"SDK(.*)", lines,)
print sdk_version.group(1)
但这给了版本 0.0.0.1) 以及我不知道如何消除")"的偏执狂。在这里需要一些帮助..
谢谢-维杰
假设版本号只能包含字母、数字、点和破折号,这就是您所需要的:
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
>>> 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
我不知道您的所有字符串是否看起来与提供的字符串完全相同,但是您提供的确切字符串的正则表达式为:
: (.*) (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')
特别是对于 SDK 版本,.* 对于您想要的内容来说太宽泛了——它匹配所有内容,因此它将匹配字符串的整个其余部分。您可以使用正则表达式正文"SDK ([0-9.]+)",然后拿第一组。("[0-9.+" 将匹配一串数字字符和句点。
对于版本字符串,您可以匹配类似"版本:([a-bA-B0-9-]+) ("的内容并取第一组 - 这表示您正在寻找由字母数字字符和连字符组成的字符串,后跟一个空格和一个开括号。
可能你想做
>>> 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'
@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 SDKs+(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"
。