【问题标题】:^[!-//-~] in regex [closed]正则表达式中的 ^[!-//-~] [关闭]
【发布时间】:2013-01-31 11:33:18
【问题描述】:

在 python 2.7 中,这个正则表达式匹配什么?

^[!-//-~]

http://docs.python.org/2/library/re.html 没有涵盖它,有没有好的来源。

【问题讨论】:

  • 文档确实涵盖了它。
  • 字符范围可以通过给出两个字符并用'-'分隔来表示,例如[az]将匹配任何小写ASCII字母,[0-5][0-9]将匹配从 00 到 59 的所有两位数字,并且 [0-9A-Fa-f] 将匹配任何十六进制数字。如果 - 被转义(例如 [a\-z])或者如果它被放置为第一个或最后一个字符(例如 [a-]),它将匹配一个文字 '-'。

标签: python regex


【解决方案1】:
  • ^ 是“字符串开头”锚点,表达式只匹配开头。

  • [...] 块是一个字符类,包含的字符被视为一个集合。一行开头的其中一个就足以构成匹配。

    类中的破折号构成一个范围,从!/,从/~;第一个范围的结尾与第二个范围的开头重叠,所以[!-~] 就足够了。

    !~ 之间的所有可打印ASCII characters,除了空格字符。 / 斜线位于数字之前;看起来好像有人在重构后忘记合并这两个集合。

所以以下任何一行都会匹配:

!whatever
"don't care
~still doesn't matter what follows
/It's the first character that counts.
ABut almost anything printable in the ASCII range matches

【讨论】:

  • 不会是[!-~](或者是python特有的转义)?
  • @Bergi:啊,不,当然,这是一个系列。 :-P
  • !-//-~ 是两个范围。实际上,它是整个 ASCII 集。
  • 唯一不在!-~ 中的可打印字符是空格:)
  • @PavelAnossov:刚刚在编辑它。:-)
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 2012-04-08
  • 2016-09-28
  • 2017-11-13
  • 2012-10-18
  • 2017-02-26
  • 1970-01-01
相关资源
最近更新 更多