【问题标题】:Using * in a sets in a python regex在 python 正则表达式的集合中使用 *
【发布时间】:2012-06-02 22:09:43
【问题描述】:

在 python 3.2.2 中,当我尝试在正则表达式模式中使用 * 时遇到了奇怪的错误。当* stads 之后/ 一切正常。但是当我尝试从模式中删除 / 时,此代码会出现错误:sre_constants.error: bad character range

import re
foo = re.search("[^123+-/*]", "123+-/*w")
if foo:
    print("foo")
else:
    print("doo")

在 python 文档中,我发现在没有任何反斜杠或其他内容的情况下使用 * 是可以接受的。但是这样的代码问题仍然存在。

【问题讨论】:

  • 顺便说一下,re.DEBUG 标志可以帮助解决这些问题(尤其是验证“已接受”的正则表达式是否符合您的预期)。
  • 我肯定会测试它。谢谢。

标签: regex python-3.x


【解决方案1】:

您的问题不是*,而是连字符减号,它表示字符类中的范围,在这种情况下,+/ (+,-./) 之间的所有字符。出现无效范围是因为* 出现在之前 /

如果您想在字符类中包含文字连字符,您必须将其转义或将其放在末尾或开头:

[^123+/*-]

【讨论】:

  • 我没有足够的声誉来投票支持您的问题。但我认为你现在必须帮助我。谢谢。
【解决方案2】:

减号导致最后一个字符被解释为一个字符范围。 [+-/] 实际上表示“+,-./ 中的任何一个”(参见 ASCII 表)。当您将 / 替换为 * 时,您将创建无效范围 [+-*],因为星号的 ASCII 代码 42 小于加号的 ASCII 代码 43。

解决方案只是逃避减号(然后它不再是一个范围)。

【讨论】:

  • 我让工作人员说要逃跑。谢谢你。请告诉我你对在集合的最后一个位置移动连字符的想法。它是否在不逃跑的情况下帮助我?转义使代码混乱。
  • 最后一个位置的连字符会起作用。是的,逃避有点尴尬。但是,当您处理一个包含 5、10 或 +20 名具有不同资格和专业水平的编码人员的大型项目时,最好使代码尽可能安全:保留反斜杠可以避免混淆(甚至是问题)尝试添加另一个字符。
猜你喜欢
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2016-11-21
  • 2010-11-12
  • 2020-09-14
  • 2016-06-10
  • 2010-12-09
相关资源
最近更新 更多