我正在开发一个简单的 wiki 引擎,我想知道是否有一种有效的方法可以根据分隔符将字符串拆分为列表,但前提是该分隔符没有用双方括号或双大括号括起来。
所以,像这样的字符串:
"|Row 1|[[link|text]]|{{img|altText}}|"
会被转换成这样的列表:
['Row 1', '[[link|text]]', '{{img|altText}}']
编辑:从示例字符串中删除了空格,因为它们会引起混淆。
您可以使用
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}}', '']
请注意前导和尾随的空字符串 - 它们需要存在,因为它们确实存在于您的第一个和您的最后一个|
测试字符串之后。
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}}']
是否有可能有第 1 行 | [?如果分隔符总是像上面的例子一样被空格包围,你可以这样做
split(" | ")