是吧! - \(从33 = ord('!')到92 = ord(' \')的字符 和'。'和'&'在一套?
根据我的测试,我认为我的解释是不正确的。
但是python引用并没有说明我的解释有什么问题。 http://docs.python.org/library/re.html
答案 0 :(得分:4)
简而言之,r'[!-\.&]'
只是一种复杂的写作形式r'[!-.]'
。
它匹配ord
和33 = ord('!')
之间46 = ord('.')
的所有字符,即以下任何字符:
!"#$%&\'()*+,-.
在字符类中忽略.
之前的转义反斜杠;它是不必要的(.
匹配字符类中的所有字符都没有任何意义)。由于&符号&
已经在字符类中,因此它也是多余的。
答案 1 :(得分:2)
这个正则表达式的意图似乎是匹配“!”之间的任何字符。和“。” (注意斜杠是逃避“。”字符),! " # $ % & ' ( ) * + , -
。 (来自http://www.tamasoft.co.jp/en/general-info/unicode.html的Unicode表格。)
关于表达式的两条评论:
[]
中转义字符(可能除了\
本身)。&
”已包含在“!-.
”定义的范围内,因此它是多余的。 答案 2 :(得分:2)
测试可能会显示模式与chr(33)
到chr(46)
匹配,但不保证模式在所有系统上以这种方式工作。这就是原因。字符集因系统而异。
这就是为什么Perl正则表达式文档特别建议“仅使用以相等大小写字母([a-e]
,[A-E]
)或数字([0-9]
的字母开头和结尾的范围)。其他任何东西都是不安全的。“(Perl正则表达式是相关的,因为这是Python使用的正则表达式。)
因此,如果此模式在基于EBCDIC的平台上运行,则它将匹配不同的字符集。在基于ASCII的平台上,模式与chr(33)
到chr(46)
匹配是正确的。
答案 3 :(得分:0)
反斜杠会转义点,因此范围将从!
到.
。正则表达式将匹配:
!"#$%&'()*+,-.
最后&
不是必需的,因为它包含在范围内,并且不需要转义点,因为它在字符类中。