在字符串python中获取正则表达式的所有出现

时间:2018-05-25 09:16:24

标签: python regex

我试图在以下字符串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 个答案:

答案 0 :(得分:2)

您可以在此处使用拆分:

>>> 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]

答案 1 :(得分:1)

我根本不擅长使用Python,但正则表达式部分使用正则表达式的特定结构符合正则表达式匹配每个段:

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

大括号和前面的/是可选的。它匹配一个斜杠标记(如果有的话),然后用它们的内容(如果有的话)括起来,然后将其余部分括到下一个斜杠标记。

Python代码(请参阅实时demo here):

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