代码之家  ›  专栏  ›  技术社区  ›  exupero

python regex中的正斜杠

  •  13
  • exupero  · 技术社区  · 16 年前

    我尝试使用python regex在字符串中查找数学表达式。问题是,正斜杠似乎做了一些意想不到的事情。我早就想到了 [\w\d\s+-/*]* 可以找到数学表达式,但由于某种原因,它也可以找到逗号。一些实验表明,正斜杠是罪魁祸首。例如:

    >>> import re
    >>> re.sub(r'[/]*', 'a', 'bcd')
    'abacada'
    

    显然,正斜杠在字符之间匹配(即使它在字符类中,但仅当星号存在时)。反斜杠是逃不过的。我搜寻了一段时间,没有找到任何文件。有什么建议吗?

    4 回复  |  直到 8 年前
        1
  •  21
  •   dantiston    8 年前

    here for documentation 论蟒蛇 re 模块。

    我想不是 / 但更确切地说 - 在第一个字符类中: [+-/] 比赛 + , / 和之间的任何ASCII值,正好包括逗号。

    也许来自文档帮助的提示:

    如果要在集合中包含“]”或“-”,请在其前面加一个反斜杠,或将其作为第一个字符。

        2
  •  7
  •   Community Mohan Dere    9 年前

    你说的是替换 或更多斜线 'a' .所以它确实用“no character”替换了每个“no character” “A” . :)

    你可能是说 [/]+ ,即一个或多个斜线。

    编辑: Ber's answer 以解决原始问题。我没有仔细阅读整个问题。

        3
  •  2
  •   jamessan    16 年前

    r'[/]*'表示“匹配0个或多个正斜杠”。在“b”和“c”之间正好有0个正斜杠。因此,这些匹配项将替换为“a”。

        4
  •  2
  •   Stephan202 Alex Martelli    16 年前

    这个 * 匹配其参数零次或多次,从而匹配空字符串。空字符串(逻辑上)位于任意两个连续字符之间。因此

    >>> import re
    >>> re.sub(r'x*', 'a', 'bcd')
    'abacada'
    

    正斜杠不做特殊处理:

    >>> re.sub(r'/', 'a', 'b/c/d')
    'bacad'
    

    这个 documentation 描述Python中正则表达式的语法。如您所见,正斜杠没有特殊的功能。

    原因在于 [\w\d\s+-/*]* 还发现逗号,是因为在方括号内的破折号 - 表示一个 范围 . 在这种情况下,您不希望在 + / ,但文字字符 + , - / .所以把破折号写为 最后的 特点: [\w\d\s+/*-]* . 这应该能解决问题。