如何将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
相关产品推荐
相关产品推荐

