bugfix> python > 投稿

私は次の文字列 TreeModel/Node/Node[1]/Node[4]/Node[1] で見つけようとしていますこの :

TreeModel/Node
TreeModel/Node/Node[1]
TreeModel/Node/Node[1]/Node[4]
TreeModel/Node/Node[1]/Node[4]/Node[1]

正規表現を使用する Pythonで。私が試したコードは次のとおりです。

string = 'TreeModel/Node/Node[1]/Node[4]/Node[1]'
pattern = r'.+?Node\[[1-9]\]'
print re.findall(pattern=pattern,string=string)
#result : ['TreeModel/Node/Node[1]', '/Node[4]', '/Node[1]']
#expected result : ['TreeModel/Node', 'TreeModel/Node/Node[1]', 'TreeModel/Node/Node[1]/Node[4]', 'TreeModel/Node/Node[1]/Node[4]/Node[1]']

回答 2 件
  • 私はPythonでは全く得意ではありませんが、regexの下の文字列の特定の構造を持つ正規表現の部分は、各セグメントに一致します:

    /?(?:{[^{}]*})?[^/]+
    
    

    中括弧とその前の /  オプションです。スラッシュマーク(存在する場合)に一致し、そのコンテンツ(存在する場合)に中かっこがあり、残りは次のスラッシュマークまで一致します。

    Pythonコード(こちらのライブデモをご覧ください):

    matches = re.findall(r'/?(?:{[^{}]*})?[^/]+', string)
    output = ''
    for i in range(len(matches)):
      output += matches[i];
      print(output)
    
    

  • ここでsplitを使用できます:

    >>> s = 'TreeModel/Node/Node[1]/Node[4]/Node[1]'
    >>> split_s = s.split('/')
    >>> ['/'.join(split_s[:i]) for i in range(2, len(split_s)+1)]
    ['TreeModel/Node',
     'TreeModel/Node/Node[1]',
     'TreeModel/Node/Node[1]/Node[4]',
     'TreeModel/Node/Node[1]/Node[4]/Node[1]']
    
    

    正規表現も使用できます。

    for i in range(2, s.count('/')+2):
        s_ = '[^/]+/*'
        regex = re.search(r'('+s_*i+')', s).group(0)
        print(regex)
    TreeModel/Node/
    TreeModel/Node/Node[1]/
    TreeModel/Node/Node[1]/Node[4]/
    TreeModel/Node/Node[1]/Node[4]/Node[1]
    
    

あなたの答え