对于正则表达式,r'[! - \。&]'是什么意思?

时间:2011-11-08 16:52:53

标签: python regex

是吧! - \(从33 = ord('!')到92 = ord(' \')的字符 和'。'和'&'在一套?

根据我的测试,我认为我的解释是不正确的。

但是python引用并没有说明我的解释有什么问题。 http://docs.python.org/library/re.html

4 个答案:

答案 0 :(得分:4)

简而言之,r'[!-\.&]'只是一种复杂的写作形式r'[!-.]'

它匹配ord33 = ord('!')之间46 = ord('.')的所有字符,即以下任何字符:

!"#$%&\'()*+,-.

在字符类中忽略.之前的转义反斜杠;它是不必要的(.匹配字符类中的所有字符都没有任何意义)。由于&符号&已经在字符类中,因此它也是多余的。

答案 1 :(得分:2)

这个正则表达式的意图似乎是匹配“!”之间的任何字符。和“。” (注意斜杠是逃避“。”字符),! " # $ % & ' ( ) * + , -。 (来自http://www.tamasoft.co.jp/en/general-info/unicode.html的Unicode表格。)

关于表达式的两条评论:

  1. 通常,您不需要在括号[]中转义字符(可能除了\本身)。
  2. &符号“&”已包含在“!-.”定义的范围内,因此它是多余的。

答案 2 :(得分:2)

测试可能会显示模式与chr(33)chr(46)匹配,但不保证模式在所有系统上以这种方式工作。这就是原因。字符集因系统而异。

这就是为什么Perl正则表达式文档特别建议“仅使用以相等大小写字母([a-e][A-E])或数字([0-9]的字母开头和结尾的范围)。其他任何东西都是不安全的。“(Perl正则表达式是相关的,因为这是Python使用的正则表达式。)

因此,如果此模式在基于EBCDIC的平台上运行,则它将匹配不同的字符集。在基于ASCII的平台上,模式与chr(33)chr(46)匹配是正确的。

答案 3 :(得分:0)

反斜杠会转义点,因此范围将从!.。正则表达式将匹配:

!"#$%&'()*+,-.

最后&不是必需的,因为它包含在范围内,并且不需要转义点,因为它在字符类中。