Python 正则表达式匹配特殊列表项

Python 正则表达式匹配特殊列表项,python,regex,python-2.7,Python,Regex,Python 2.7,我有一个奇怪的项目列表和类似这样的列表,|作为分隔符,[[]]作为括号。看起来是这样的: | item1 | item2 | item3 | Ulist1[[ | item4 | item5 | Ulist2[[ | item6 | item7 ]] | item8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14 | item1 | item2 | item3 | Ulist1[[ | Uitem4 |

我有一个奇怪的项目列表和类似这样的列表,
|
作为分隔符,
[[]]
作为括号。看起来是这样的:

| item1 | item2 | item3 | Ulist1[[ | item4 | item5 | Ulist2[[ | item6 | item7 ]] | item8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14
| item1 | item2 | item3 | Ulist1[[ | Uitem4 | Uitem5 | Ulist2[[ | Uitem6 | Uitem7 ]] | Uitem8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14
我想使用正则表达式匹配名为
Ulist*
(项目4-8)的列表中的项目,并将它们替换为
Uitem*
。结果应该如下所示:

| item1 | item2 | item3 | Ulist1[[ | item4 | item5 | Ulist2[[ | item6 | item7 ]] | item8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14
| item1 | item2 | item3 | Ulist1[[ | Uitem4 | Uitem5 | Ulist2[[ | Uitem6 | Uitem7 ]] | Uitem8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14
我尝试了几乎所有我知道的关于正则表达式的东西,但是我没有发现任何正则表达式与Ulists中的每一项都匹配。我现在的正则表达式:

/Ulist(\d+)\[\[(\s*(\|\s*[^\s\|]*)*\s*)*\]\]/i
怎么了?我是正则表达式的初学者

它在Python 2.7中,具体来说,我的代码是:

    def fixDirtyLists(self, text):
        text = textlib.replaceExcept(text, r'Ulist(\d+)\[\[(\s*(\|\s*[^\s\|]*)*\s*)*\]\]', r'Ulist\1[[ U\3 ]]', '', site=self.site)
        return text
text
获取这个奇怪的列表,
textlib
用RegEx替换RegEx。一点也不复杂。

如果您安装(使用Python2.7.9+,在
\Python27\Scripts\
文件夹中只需
pip install regex
即可完成),您将能够匹配嵌套的方括号。您可以匹配所需的字符串,仅在这些子字符串中用
Uitem
替换
item

模式(请参见,注意PyPi正则表达式递归类似于PCRE):

一个简短的解释:
(Ulist\d+)
是第1组,它匹配一个字面单词
Ulist
,后跟一个或多个数字,后跟
(\[\[(?>[^][].[].[(?!])\[(?!\[)\[(?2))
,它匹配以
[[
开头的子字符串,直到相应的
]

以及Python代码:

>>> import regex
>>> s = "| item1 | item2 | item3 | Ulist1[[ | item4 | item5 | Ulist2[[ | item6 | item7 ]] | item8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14"
>>> pat = r'(Ulist\d+)(\[\[(?>[^][]|](?!])|\[(?!\[)|(?2))*]])'
>>> res = regex.sub(pat, lambda m: m.group(1) + m.group(2).replace("item", "Uitem"), s)
>>> print(res)
| item1 | item2 | item3 | Ulist1[[ | Uitem4 | Uitem5 | Ulist2[[ | Uitem6 | Uitem7 ]] | Uitem8 ]] | item9 | list3[[ | item10 | item11 | item12 ]] | item13 | item14
要避免修改
Ulist
中的
列表
s,请使用

def repl(m):
    return "".join([x.replace("item", "Uitem") if not x.startswith("list") else x for x in regex.split(r'\blist\d*\[{2}[^\]]*(?:](?!])[^\]]*)*]]', m.group(0))])
并将
regex.sub
替换为

res = regex.sub(pat, repl, s)

您以前已经问过这个问题,但它已被删除。你为什么还要问?请加上你的代码图片,在哪里使用这个RE,我以前从来没有问过。添加了一段代码并询问UpdatedId是否尝试PyPi正则表达式模块?它支持递归。谢谢,如果它对我有效与否,我会尝试并编写,但它看起来是一个很好的解决方案。当
Ulist
中有
列表时,会出现问题。我不想将该列表中的项目更改为Uitems,因为它不是Ulist。你知道如何解决这个问题吗?用回调方法处理应该更容易。我需要一些时间来检查。您可以使用
regex.sub(regex\u模式,替换,输入)
x.replace(旧的,新的)
仅使用常规字符串替换。当使用
re
/
regex
时,您需要
(re或regex).sub(regex\u搜索\u旧的,模式\u替换为\u新的,x)
。我认为pastebin的代码应该可以工作。