字符串如下所示:( \n
用于断行)
MySQL-vm
Version 1.0.1
WARNING:: NEVER EDIT/DELETE THIS SECTION
我想要的只是1.0.1。
我正在尝试re.search(r"Version+'([^']*)'", my_string, re.M).group(1)
,但它无效。
re.findall(r'\d+', version)
正在给我一系列数字,我必须再追加。
如何改进正则表达式?
答案 0 :(得分:10)
使用以下正则表达式并从组索引1获取版本号。
Version\s*([\d.]+)
>>> import re
>>> s = """MySQL-vm
... Version 1.0.1
...
... WARNING:: NEVER EDIT/DELETE THIS SECTION"""
>>> re.search(r'Version\s*([\d.]+)', s).group(1)
'1.0.1'
<强>解释强>
Version 'Version'
\s* whitespace (\n, \r, \t, \f, and " ") (0 or
more times)
( group and capture to \1:
[\d.]+ any character of: digits (0-9), '.' (1
or more times)
) end of \1
答案 1 :(得分:1)
您也可以尝试使用Positive Look behind不消耗字符串中的字符,但仅断言是否可以匹配。在下面的正则表达式中,您不需要findAll
和group
函数。
(?<=Version )[\d.]+
说明:
(?<= look behind to see if there is:
Version 'Version '
) end of look-behind
[\d.]+ any character of: digits (0-9), '.' (1 or more times)
答案 2 :(得分:1)
(?<=Version\s)\S+
试试这个。使用re.findall
。
x="""MySQL-vm
Version 1.0.1
WARNING:: NEVER EDIT/DELETE THIS SECTION"""
print re.findall(r"(?<=Version\s)\S+",x)
输出:[ '1.0.1']
参见演示。
答案 3 :(得分:0)
https://regex101.com/r/5Us6ow/1
位递归以匹配1、1.0、1.0.1之类的版本:
def version_parser(v):
versionPattern = r'\d+(=?\.(\d+(=?\.(\d+)*)*)*)*'
regexMatcher = re.compile(versionPattern)
return regexMatcher.search(v).group(0)