Swift中如何解析infobox格式复杂字符串并提取数据为字典
你遇到的是维基类站点常用的MediaWiki Infobox模板语法,完全不用硬切字符串处理,有更简洁的方案,也可以实现类似JSON解析的结构化建模处理,以下是两种常用方案:
方案1:轻量正则匹配(适合规则固定的简单Infobox)
针对你给出的这种每行都是|键 = 值格式的Infobox,用正则提取键值对就足够高效,下面是Python的示例代码:
import re from html import unescape infobox_str = """{infobox Country |country = France |map = <map lat='47' lng='1.5' zoom='5' view='0' height='320' country='France'/> |language = French (regional languages: Alsatian, Occitan, Breton, Corsican, Basque, Catalan, ...) |capital = [[Paris]] |pop = 65,8 million |currency = Euro (€) |hitch = <rating country='fr' /> |BW = FR }""" # 匹配所有 |键 = 值 的行,支持值内换行的场景 pattern = re.compile(r'\|\s*(\w+)\s*=\s*(.*?)\s*(?=\n\||\n})', re.DOTALL) result = {} for match in pattern.finditer(infobox_str): key = match.group(1) # 解码HTML转义字符,比如把<转回< value = unescape(match.group(2)) result[key] = value print(result)
运行后就能直接输出你需要的字典结构,如果你不需要保留[[Paris]]这类wikitext标记,额外加一步字符串替换即可。
方案2:通用Wikitext解析(适合复杂场景)
如果后续需要处理嵌套模板、字段值多行换行等复杂的Wikitext内容,可以直接用专门的Wikitext解析库,和解析JSON的逻辑几乎一致:先把整段文本解析成语法树结构,再直接提取对应字段即可,不需要自己写匹配规则。
以Python的mwparserfromhell库为例,代码更简洁:
import mwparserfromhell from html import unescape wikicode = mwparserfromhell.parse(unescape(infobox_str)) # 提取文本中的第一个Infobox模板 infobox = wikicode.filter_templates()[0] result = {param.name.strip(): str(param.value).strip() for param in infobox.params} print(result)
这种方案扩展性更强,哪怕后续Infobox格式发生变化,也不需要大量修改代码逻辑。
内容的提问来源于stack exchange,提问作者Kacper Cichosz
相关产品推荐
相关产品推荐

