2014-07-08 23 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'