【问题标题】:How can I match namespace prefixes with regular expression如何将命名空间前缀与正则表达式匹配
【发布时间】:2014-07-19 07:07:40
【问题描述】:

我真正想做的是使用正则表达式匹配标签和属性的所有命名空间前缀。

例如:

<foo:person bar:id="43">
  text text <nomatch:free text
  <baz:name>
    text nomatch:free> text
  </baz:name>
    text nomatch:free="44" text
    <age bae:years="44" />
    text
</foo:person>

我想要的是只提取以下前缀:foo、baz、bad、bae、bar

我找不到实现这个的正则表达式。

请注意正则表达式不应硬编码名称 foo、baz、bad、bae、bar...

【问题讨论】:

  • 使用 xml 解析器。 xml 不是常规语言
  • 问题中给出的示例文本不是 XML(由于未转义的 &lt;),因此在这种情况下,XML 解析器将无法工作。

标签: regex xml namespaces prefix


【解决方案1】:

像这样吗?

[<]([^:]+)

会将前缀(尖括号之后和冒号之前)放入第 1 组。

我发现我在仔细观察后误解了这个问题。

[<](((\w+):\w+)(\s+(\w+):\w+="\d+"\s*[\/])?)>

这将产生 $3 组和可能 $5 组的结果。我想这样就可以了。

哎呀,错过了?

 [<](((\w+):\w+)(\s+(\w+):\w+="\d+"\s*[\/]?)?)>

【讨论】:

  • 哦,抱歉,刚刚意识到您也需要这些参数。
  • 不幸的是这个正则表达式不起作用.. :(
【解决方案2】:
import re
x='<foo:person bar:id="43">'
y=re.findall(r"(\w+)(?=:)",x)
print y
['foo', 'bar']

这是在python中。希望这能解决你的问题。

【讨论】:

    【解决方案3】:

    这是一个 perl 版本:

    my @collects = $str =~ /[<|\s](\w+):[^free]/ig;
    

    【讨论】:

    • 哦,现在很常见,那是作弊:)
    • @mclaassen 他没有说不使用值,只是不使用硬编码名称。 :P 无论如何,这是一个改进的版本:my @collects = $str =~ /&lt;(\w+):\w+(?:\s(\w+):\w+=.+)?&gt;/g;
    • 不幸的是这个正则表达式不起作用.. :(
    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多