2017-08-17 98 views
0

与期望的结果我的正则表达式我有一个表达如下:这个表达式可以通过线多次被重复。不完全匹配在python3

period={p1:{R:{M:'-1'}},p2:{R:{D:{start:'-28',end:'-1'}} 

在Python 3,我写了下面的代码:

RE_DAY_END = re.compile(r'(D:{start:\'-\d+\'\,end:\')+(?P<dend>\-[0-9]+)') 
match_day= RE_DAY_END.findall(x) 
print(match_day) 

我不能undrestand发生的事情是我收到的时候我期待着得到其他结果的输出:

I am not interested: [("D:{start:'-28',end:'", '-1')] 

    I need this one:  [("D:{start:'-28',end:'-1')] 

什么样的变化我应该做的,以获得第二个结果?

+1

还原所有组非捕获。删除'dend'组。或者使用're.finditer'来访问'.group(0)'。请参阅https://ideone.com/dHAYUl –

+1

阅读“pydoc3 re.findall”了解发生了什么。 – Gribouillis

+0

是的,这对我的作品感谢您的解决方案。正如我在这个解决方案中看到的那样,你也没有删除dend组? –

回答

1

简单的方法来提取单个子(re.search()功能):

s = "period={p1:{R:{M:'-1'}},p2:{R:{D:{start:'-28',end:'-1'}}" 
result = re.search(r'D:\{[^{}]+\}', s).group() 
print(result) 

输出:

D:{start:'-28',end:'-1'} 
+0

这也很有趣。唯一的一点是,如果你在句子中有几种模式,只能找到你的第一个模式,而不是其余的,也许我们可以使用findall而不是搜索。或者用我用@WiktorStribiżew –

+0

的解决方案'根据你的初始输入和预期的输出re.search'。当然,对于多个匹配're.findall'或're.finditer'应使用 – RomanPerekhrest

+0

另外还有一点,就是在你表达我不能捕捉精彩的开始和结束,如果我不是这两个词的另一个,然后将为我提取它。顺便说一句,你可以开始一点点什么在做你的表达? –