【发布时间】:2016-01-21 12:15:26
【问题描述】:
我有奇怪的项目列表和类似这样的列表,| 作为分隔符,{{ }} 作为括号。它看起来像这样:
| item1 | item2 | item3 | {{Ulist1 | item4 | item5 | {{Ulist2 | item6 | item7 }} | item8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item14
我想使用 RegEx 匹配名为 Ulist* 的列表中的项目(项目 4-8),并将它们替换为 Uitem*。结果应如下所示:
| item1 | item2 | item3 | {{Ulist1 | Uitem4 | Uitem5 | {{Ulist2 | Uitem6 | Uitem7 }} | Uitem8 }} | item9 | {{list3 | item10 | item11 | item12 }} | item13 | item14
更新:
我根据this question 尝试了一个解决方案,但如果Ulist 中有list,则该问题的答案不起作用。它在 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)
【问题讨论】:
-
您可能会发现使用正则表达式以外的其他东西更容易......它通常不适用于任意嵌套的结构。
-
我也这么认为,但不知道怎么做。有人已经用一些链接回答了这个问题,如何在没有正则表达式的情况下以编程方式进行,但他删除了他的答案:/
-
@AlexKupil 我可以看到这个已删除的答案,here's the link 你正在谈论,如果它可以帮助的话。
-
我仍然需要一些正则表达式来将项目替换为 Uitem(因为这只是我真正想要的简化案例),但我的问题的主要部分(查找 Ulists 并在其中处理项目) 仍然打开
-
就是那个链接,谢谢
标签: python regex python-2.7