You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将TiddlyWiki格式的标签字符串转换为Python列表?

哈哈,这个问题我之前帮朋友处理过,直接用split()确实搞不定——毕竟TiddlyWiki的标签规则里,空格既是标签间的分隔符,又是多词标签内部的字符,被[[ ]]包起来的空格不能用来拆分。给你两个靠谱的解决方案:

方案1:正则表达式(最简洁高效)

用正则匹配两种标签模式:被[[ ]]包裹的多词标签,以及普通的单词标签,然后提取出内容即可。

import re

tiddly_tag_str = "foo [[ram doo]] bar [[very cool]]"
# 正则匹配:要么是[[...]]里的内容,要么是非空白字符组成的单词
matches = re.findall(r'\[\[(.*?)\]\]|(\S+)', tiddly_tag_str)

# 处理匹配结果,过滤空值并整理成列表
tags = []
for multi_word, single_word in matches:
    if multi_word:
        tags.append(multi_word)
    elif single_word:
        tags.append(single_word)

print(tags)  # 输出: ['foo', 'ram doo', 'bar', 'very cool']

正则逻辑说明:

  • \[\[(.*?)\]\]:匹配[[和]]之间的任意内容,.*?是非贪婪模式,避免把多个]]之间的内容误匹配成一个标签。
  • |(\S+):匹配连续的非空白字符,也就是普通的单词标签。
  • 每个匹配结果是一个元组,要么第一个元素是多词标签,要么第二个是单词标签,我们只需要取非空的那个就行。

方案2:手动字符解析(无正则依赖)

如果不想用正则,也可以手动遍历字符串,跟踪是否处于[[ ]]内部,来决定如何收集标签内容:

tiddly_tag_str = "foo [[ram doo]] bar [[very cool]]"
tags = []
current_tag = []
inside_brackets = False
index = 0
str_len = len(tiddly_tag_str)

while index < str_len:
    char = tiddly_tag_str[index]
    
    # 遇到[[,标记进入多词标签模式,跳过两个[
    if char == '[' and index + 1 < str_len and tiddly_tag_str[index+1] == '[':
        inside_brackets = True
        index += 2
        continue
    
    # 遇到]],标记退出多词标签模式,把当前收集的内容加入列表,跳过两个]
    if char == ']' and index + 1 < str_len and tiddly_tag_str[index+1] == ']':
        inside_brackets = False
        if current_tag:
            tags.append(''.join(current_tag))
            current_tag = []
        index += 2
        continue
    
    # 处于多词标签内部时,直接收集字符
    if inside_brackets:
        current_tag.append(char)
    else:
        # 非标签内部,遇到空格就结束当前单词标签
        if char == ' ':
            if current_tag:
                tags.append(''.join(current_tag))
                current_tag = []
        else:
            current_tag.append(char)
    
    index += 1

# 处理最后一个未被添加的标签
if current_tag:
    tags.append(''.join(current_tag))

print(tags)  # 输出: ['foo', 'ram doo', 'bar', 'very cool']

手动解析逻辑说明:

  • 用inside_brackets标记是否处于[[ ]]内部,内部的空格会被保留作为标签的一部分。
  • 遇到[[或]]时,调整标记并跳过对应的符号,避免把这些符号加入标签内容。
  • 非内部遇到空格时,就把当前收集的单词标签加入列表,重置收集器。

两种方案都能完美解决你的问题,正则方案更简洁,手动解析则适合需要更精细控制或者不想依赖正则的场景~

内容的提问来源于stack exchange,提问作者somenxavier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:59:40