2016-01-24 69 views
-4

我一直在寻找一个正则表达式验证电子邮件时,我发现这一点:为什么[^ @]正则表达式的行为方式如此?

[^@][email protected][^@]+\.[^@]+ 

[^@]表达似乎不起作用像机制的文档说它应该。

s = 'test' 

match = re.match("[^@]", s) 

print(match.group()) 

这例如打印字符串的第一个字符是t。 如果我使用正则表达式[^],我收到一个错误:unexpected end of regular expression。该文件说:

Special characters lose their special meaning inside sets.

[]是一套和^是一个特殊字符。

+0

确保正确的题目问题。 “[^ @]'表达式正如它所记录的那样正确地工作,并且还没有其他情况发生;它是引发错误的'[^]'表达式。 – user2864740

回答

5

“特殊字符在集合内部失去特殊含义”的说法是真实的,因为插入字符有两个特殊含义;在正则表达式(它是一个锚点)的逻辑开始处,以及在字符类的开始处(or 'character set' where it forms a 'complementing set of characters')。

报告的错误来自[^]结构,由于字符类未关闭,所以该结构无效:^影响下一个字符。

在这种情况下,效果是]确实不是关闭字符类并且整个正则表达式“未结束”,导致正则表达式语法错误。


不管怎样,错误报道了[^]无关与[^@]这是一个字符类,将任何字符匹配除了@。这一点,再加上不正确对焦标题,或许可以解释一些downvotes的..

re.match("[^]", "anything") # => regex error, as explained above 
re.match("[^]]", "z")   # => match; z is not ] 
re.match("[^@]", "z")   # => match; z is not @ 
re.match("[^@]", "@")   # => no match 
0

[^]是一个特例。它的意思是“匹配不在括号内的单个字符”。有关更多详细信息,请参阅the wiki page

0

字符^是一个特殊字符。

^Test ... matches a string that starts with Test 
    \^ ... matches the character^
[\^] ... matches the character^
[^^] ... matches a character that is not a^
[-^] ... matches a - or a^
[^-] ... matches a character that is not a - 
[\^-] ... matches a - or a^
+0

这个问题更多关于_why_这个脱字符的行为方式,而不是表达的意思。 –