如果未包含分隔符,则将字符串拆分为列表

时间:2013-10-05 21:08:51

标签: python regex

我正在研究一个简单的wiki引擎,我想知道是否有一种有效的方法可以将字符串拆分为基于分隔符的列表,但前提是该分隔符未用双方括号或双卷曲括起来括号中。

所以,这样的字符串:

"|Row 1|[[link|text]]|{{img|altText}}|"

会转换为这样的列表:

['Row 1', '[[link|text]]', '{{img|altText}}']

编辑:从示例字符串中删除了空格,因为它们引起了混淆。

3 个答案:

答案 0 :(得分:3)

您可以使用

def split_special(subject):
    return re.split(r"""
        \|           # Match |
        (?!          # only if it's not possible to match...
         (?:         # the following non-capturing group:
          (?!\[\[)   # that doesn't contain two square brackets
          .          # but may otherwise contain any character
         )*          # any number of times,
         \]\]        # followed by ]]
        )            # End of first loohahead. Now the same thing for braces:
        (?!(?:(?!\{\{).)*\}\})""", 
        subject, flags=re.VERBOSE)

结果:

>>> s = "|Row 1|[[link|text|df[sdfl|kj]|foo]]|{{img|altText|{|}|bar}}|"
>>> split_special(s)
['', 'Row 1', '[[link|text|df[sdfl|kj]|foo]]', '{{img|altText|{|}|bar}}', '']

请注意前导和尾随空字符串 - 它们需要存在,因为它们确实存在于测试字符串中的第一个|之前和之后。

答案 1 :(得分:1)

Tim的表达很复杂,但你通常可以通过将它们转换为“匹配”表达来大大简化“拆分”表达式:

import re
s = "|Row 1|[[link|text|df[sdfl|kj]|foo]]|{{img|altText|{|}|bar}}|"

print re.findall(r'\[\[.+?\]\]|{{.+?}}|[^|]+', s)

# ['Row 1', '[[link|text|df[sdfl|kj]|foo]]', '{{img|altText|{|}|bar}}']

答案 2 :(得分:-2)

是否可以拥有第1行| [?如果分隔符始终被空格包围,就像上面的示例一样,您可以执行

split(" | ")