2012-01-11 13 views
4

正規表現としてバージョン番号を表現する必要があります。広義の定義は正規表現としてのバージョン番号の表現

  1. のみ2..,2.3.であるのに対し

だから2.3.4.1,2.3,2,9999.9999.9999がすべて有効である任意の小数点以下の桁数(ただし、連続して)最大数の

  • 制限なしを許可
  • 数字で構成されていますない。

    私は「2.6.31」に次のような単純な正規表現

    '(\d+\.{0,1})+' 
    

    reモジュールとpythonでそれを使用して検索を書いたが

    >>> y = re.match(r'(\d+\.{0,1})+$','2.6.31') 
    >>> y.group(0) 
    '2.6.31' 
    >>> y.group(1) 
    '31' 
    

    を与えるしかし、私はグループに名前を付ける場合、名前付きグループには31しかありません。

    正規表現は正しいですか、それとも調整することはできますか?現在、2.3.のケースは処理されていません。

  • +2

    キャプチャグループは、パターンの最後の発生のみを保持します。 –

    答えて

    6

    表記{0,1}だけ?に短縮することができる。

    r'(\d+\.?)+$' 
    

    しかしながら、上記後続.を可能にするであろう。おそらく試してください:

    あなたはフォーマットを検証したら
    r'\d+(\.\d+)*$' 
    

    は、あなたが期待するものと一致し、数字を出すための最も簡単な方法はre.findall()である。また

    >>> ver = "1.2.3.4" 
    >>> re.findall(r'\d+', ver) 
    ['1', '2', '3', '4'] 
    
    +0

    ええ、....私の心が崩れました。しかし、末尾の小数点を扱う方法 – RedBaron

    2

    、あなたがpyparsingを使用する場合があります

    >>> from pyparsing import * 
    >>> integer = Word(nums) 
    >>> parser = delimitedList(integer, delim='.') + StringEnd() 
    >>> list(parser.parseString('1.2.3.4')) 
    ['1', '2', '3', '4'] 
    

    またはlepl

    >>> from lepl import * 
    >>> with Separator(~Literal('.')): 
    ... parser = Integer()[1:] 
    >>> parser.parse('1.2.3.4') 
    ['1', '2', '3', '4'] 
    
    +0

    このパターン 'something + ZeroOrMore(Suppress(delimiter)+ something')は非常に一般的なので、pyparsingはヘルパー関数' delimitedList'を提供して、パーサを 'parser = delimitedList(integer 、delim = '。') 'と同じ結果を得ます。 – PaulMcG

    +0

    @PaulMcGuireあなたのコメントだけでなく、pyparsingのためにも、ありがとう。 – jcollado