具有属性的模板标记的正则表达式

时间:2011-01-08 05:26:40

标签: regex attributes tags

在阅读了所有这些帖子之后,我还没有找到答案,所以我希望你们中的一个重量级的正则表达人们可以帮助我。我正在尝试从以下字符串格式中隔离标记名称和任何属性:

{TAG:TYPE attr1="foo" attr2="bar" attr3="zing" attr4="zang" attr5="zoom" ...}

注意:在上面的例子中,TAG将始终相同,TYPE将是几个预设字符串之一(例如,共享,打印,显示等...)。 TAG和TYPE仅在示例中为大写,但对于实际情况不会区分大小写。

1 个答案:

答案 0 :(得分:0)

目前,我们假设您的属性名称和值以及您的TAG和TYPE都是严格的字母数字。如果你可以在这些字符串中包含“或=”,那么解析会变得更加混乱(甚至可能不是常规的)。

有了这些警告,这是一个完成工作的python正则表达式:

>>> parse_regex=r'\{(?P<tag>\w+):(?P<type>\w+)(?P<attrs>(\s+\w+=\"\w+\")*)\}'
>>> m = re.match(parse_regex, str)
>>> m.group('tag')
'TAG'
>>> m.group('type')
'TYPE'
>>> m.group('attrs')
' attr1="foo" attr2="bar" attr3="zing" attr4="zang" attr5="zoom"'

此时,您需要将属性清理为友好的数据结构。由于可能会有任意多个,因此在此阶段使用正则表达式会更方便(而且效率更高)。

>>> [attr_str.split('=') for attr_str in m.group('attrs').split()]
[['attr1', '"foo"'], ['attr2', '"bar"'], ['attr3', '"zing"'], ['attr4', '"zang"'], ['attr5', '"zoom"']]