2014-07-08 21 views
-2

如何编写解析版本号的正则表达式。我要像匹配的数字:1.0001.0.001.0.0.000但不是整数110100解析版本号的正则表达式

+0

不清楚。给出一些你想要匹配什么样的例子,你不会有什么? –

+0

所以用逗号分隔,必须是数字或星号,然后必须包含一个点? –

+0

@TonyHopkinson对不起,谁说了什么关于逗号? – jforberg

回答

0

大我想你想这样的事情,

(?:(\d+\.[.\d]*\d+)) 

OR

(?:(\d+\.(?:\d+\.)*\d+)) 

DEMO

>>> import re 
>>> str = 'foobar 1.000, 1.0.00, 1.0.0.000 10 100 foo bar foobar' 
>>> m = re.findall(r'(?:(\d+\.(?:\d+\.)*\d+))', str) 
>>> m 
['1.000', '1.0.00', '1.0.0.000'] 
+0

这匹配'1..1'。 –

+0

@AshBurlaczenko这个['(?:(\ d + \。(?:\ d \。)* \ d +))'](http://regex101.com/r/fU3fH9/11)怎么样? –

+0

新的不匹配,'1.12.1'。 –

1

试试这个正则表达式:

^(\d+\\.)?(\d+\\.)?(\\*|\d+)$ 
+0

我编辑了这个问题 – Juli

1

澄清:我假设你想解析的号码,不只是匹配他们。

为什么使用正则表达式时,一个简单的分裂将工作得很好?

'1.3.4.*'.split('.') # => ['1', '3', '4', '*']

如果你想确保有字符串中的至少一个点,检查数组的长度,以确保它是大于1

+0

想要用逗号分开,并且不希望没有至少一个点的匹配... –

+0

@TonyHopkinson,它在哪里说他们想用逗号分隔?如果有超过1个部分,分割会告诉你。 –

+1

@Tonyhopkinson这很简单,只需检查结果数组的长度,看看它是否大于1。 – RevanProdigalKnight

1

这并不直接回答您的问题,但它假设您希望此功能比较不同版本的应用程序。

你可以做到这一点使用distutils.version(该文档是空的,但我们可以发现在source函数文档)

几个例子来帮助理解我们在做什么:

>>> from distutils.version import LooseVersion, StrictVersion 
>>> LooseVersion("1.0.1") < LooseVersion("1.0.2") 
True 
>>> StrictVersion("1.0.1") < StrictVersion("1.0.2") 
True 
>>> LooseVersion("1.0.10") < LooseVersion("1.0.1") 
False 

有什么LooseVersionStrictVersion之间的区别?随着LooseVersion你可以比较 “真实世界” 的版本是这样的:

>>> LooseVersion("2.1-rc1") < LooseVersion("2.2") 
True 

StrictVersion不允许字母字符

>>> StrictVersion("2.1-rc1") < StrictVersion("2.2") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\distutils\version.py", line 40, in __init__ 
    self.parse(vstring) 
    File "C:\Python27\lib\distutils\version.py", line 107, in parse 
    raise ValueError, "invalid version number '%s'" % vstring 
ValueError: invalid version number '2.1-rc1'