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

时间:2016-01-18 14:44:40

标签: python regex python-2.7

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

| 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

我尝试了几乎所有关于RegEx的知识,但是我没有发现任何RegEx与Ulist中的每个项目相匹配。我目前的RegEx:

/Ulist(\d+)\[\[(\s*(\|\s*[^\s\|]*)*\s*)*\]\]/i

有什么问题?我是RegEx的初学者。

它是在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。根本不复杂。

1 个答案:

答案 0 :(得分:1)

如果您安装PyPi regex module(使用Python 2.7.9+,只需item文件夹中的Uitem即可完成,您将能够匹配嵌套的方括号。您可以匹配所需的字符串,将(Ulist\d+)(\[\[(?>[^][]|](?!])|\[(?!\[)|(?2))*]]) ^-Group1-^^-----------Group2--------------------^ 替换为(Ulist\d+)仅在这些子字符串中。

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

Ulist

一个简短的解释:(\[\[(?>[^][]|](?!])|\[(?!\[)|(?2))*]])是第1组,其匹配字面词[[,后跟一个或多个数字,后跟]],匹配以>>> 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 开头的子字符串相应的list

Python代码:

Ulist

要避免修改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)

并将phantom = require 'phantom' parameters = { loadimages: '--load-images=no', websecurity: '--web-security=no', ignoresslerrors: '--ignore-ssl-errors=yes', proxy: '--proxy=10.0.1.235:8118', } urls = { checktor: "https://check.torproject.org/", google: "https://google.com", } phantom.create parameters.websecurity, parameters.proxy, (ph) -> ph.createPage (page) -> page.open urls.checktor, (status) -> console.log "page opened? ", status page.evaluate (-> document.title), (result) -> console.log 'Page title is ' + result ph.exit() 替换为

XMPPStream.h