2016-01-21 51 views
2

我有奇怪的项目列表和这样的列表与|作为分隔符和{{ }}作为括号。它看起来像这样:正则表达式来匹配特殊列表项目二

| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item14 

我想用正则表达式来匹配列表称为Ulist*(项目4-8)项目,并与Uitem*替换它们。结果应该是这样的:

​​

更新:

我想一个解决方案根据this question,但从问题的答案是不行的,如果有一个Ulistlist 。它是在Python 2.7,特别是我的代码是:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import regex 
def repl(m): 
    return "".join([x.replace("item", "Uitem") if x.startswith("{{Ulist") else x for x in regex.split(r'\{{2}(?=(\blist\d*))[^\}]*(?:}(?!})[^\}]*)*}}', m.group(0))]) 
text = "| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 | {{list4 | item15 | item16 }} | item17 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item14" 
rex = r'(\{\{(?=(Ulist\d*))(?>[^}{]|}(?!})|\{(?!\{)|(?1))*}})' 
text = regex.sub(rex, repl, text) 
print(text) 
+2

你可能会发现使用除正则表达式之外的东西更容易一些......它通常不会适用于任意嵌套的结构。 – glibdud

+0

我也这么认为,但我不知道如何。有人已经用一些链接回答了这个问题,如何在没有正则表达式的情况下以编程方式来完成它,但他删除了他的答案:/ – aleskva

+1

@AlexKupil正如我可以看到这个被删除的答案,[这里是链接](http://stackoverflow.com/ (546433/regular-expression-to-match-outer-brackets)),如果它可以帮助的话。 – zessx

回答

2

也许这可以让你开始:

def parse(data): 
    items = [i.strip() for i in data.split('|')] 
    newitems = [] 
    nest = [False] 
    for item in items: 
     if item.startswith('{{'): 
      if item.startswith('{{Ulist'): 
       nest.append(True) 
      else: 
       nest.append(False) 
      newitems.append(item) 
     else: 
      if item.startswith('item') and nest[-1]: 
       newitems.append('U' + item) 
      else: 
       newitems.append(item) 
     if item.endswith('}}'): 
      nest.pop() 
    return ' | '.join(newitems) 

基本上它会将数据在分隔符(|)上,并且犯了罪gle在它们上面循环,在合适的地方转换并保持状态,称为nest,以确定它应该在何时转换。它假定围绕分隔符的空白不重要。

+0

是的,这里没有正则表达式!因此一个正确的答案。 – RickyA

0

其实正则表达式是错误的工具,以比赛括号/括号/括号,见here

反正你可以在这种情况下使用regex为如下─

import regex 

s='| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1' 

def itm_changer(txt): 
    return ''.join(txt.captures()).replace('item','Uitem') 

def changer(data): 
    return regex.sub(r'\{\{Ulist\d{0,}(?>[^\}\{]+|(?0))+\}}',lambda x: itm_changer(x),data) 

print changer(s) 

注:您可以随意修改。

输出 -

| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item1 

要见正则表达式的细节这里使用查阅LIVE DEMO

+0

中的列表@glibdud确定编辑答案。 – SIslam