首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在Python2中使用`lxml`库时这个正则表达式会出现错误?

为什么在Python2中使用`lxml`库时这个正则表达式会出现错误?
EN

Stack Overflow用户
提问于 2017-10-25 19:55:20
回答 3查看 1.1K关注 0票数 0

我对XSD模式中的正则表达式有一个问题。lxml说正则表达式是无效的,而我确信它应该有效。

代码语言:javascript
运行
复制
<xs:element name="birth_date">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="valeur">
        <xs:simpleType>
          <xs:union>
            <xs:simpleType>
              <xs:restriction base="xs:date"></xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:pattern
                  value="(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})"></xs:pattern>
              </xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:maxLength value="0"></xs:maxLength>
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
        </xs:simpleType>
      </xs:element>
      <xs:element type="xs:string" name="backgroundcolor"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

我有这个错误:

代码语言:javascript
运行
复制
The value '(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})' of the facet 'pattern' is not a valid regular expression.

如果你能帮助我,我将不胜感激。

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2017-10-25 20:37:06

XSD正则表达式不支持非捕获组(?:)和反向引用(\1\2等)。如果您删除这些构造,您的语法错误将被消除。

票数 1
EN

Stack Overflow用户

发布于 2017-10-26 00:11:37

在符合XSD规范的XSD模式中,pattern的值必须是XSD规范为正则表达式定义的语言中的字符串。在许多细节上,该语言遵循Perl正则表达式,但由于在XSD中使用模式的方式,在语义和语法上存在一些差异。

  • 与Perl模式不同,XSD模式是严格意义上的正则表达式,因为它们可以识别正则语言。它们不包括诸如括号匹配或子字符串重复之类的花哨功能,这些功能需要的不仅仅是正则表达式的能力。
  • 与简单类型定义中的所有方面一样,使用模式来生成布尔结果:候选文字要么与正则表达式匹配,要么不匹配。在XSD中没有使用部分文字字符串的工具,因此没有必要使用正则表达式引擎保留与特定正则表达式匹配的字符串部分的记录,以便稍后可以通过\1\2等形式的引用检索该子字符串。

由于\是XSD正则表达式中的元字符,并且\1等没有定义为转义序列,因此字符串\1不是合法的XSD正则表达式,任何包含它的字符串也不是。(从\9.)

  • Since \2到XSD正则表达式同样没有指示引擎记忆子字符串的工具,也没有区分应该记住匹配字符串的带括号表达式和不需要记住匹配字符串的表达式(捕获组和非捕获组)的实用程序。

由于XSD是必须以正则表达式开头的元字符,并且(不是合法正则表达式,也不是任何合法正则表达式的最后一个字符,除非进行转义(字符串'\(‘是合法正则表达式),因此字符串(?不是合法XSD正则表达式,也不能作为任何合法XSD正则表达式的子字符串出现,除非左括号前面有反斜杠。

XSD正则表达式确实具有捕获和非捕获组的指令,并且它们相应地扩展了XPath正则表达式语法。

  • 由于模式必须由整个候选文字匹配,因此没有必要区分锚定和非锚定的正则expressions.The字符'^‘和'$’在XSD正则表达式中是合法的,但它们不是元字符,并且它们与行或字符串的开头和结尾不匹配:它们匹配字符'^‘和'$’。

您的正则表达式可能还有其他问题;首先想到的就是这些问题。

票数 1
EN

Stack Overflow用户

发布于 2017-10-25 20:38:40

我把这个模式放进去了,很有效,谢谢你们

代码语言:javascript
运行
复制
<xs:pattern value="[0-3][0-9]-[01][0-9]-[0-9]{4}"></xs:pattern>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46931790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档