我正在用python学习正则表达式。同时,在一个阶段中,我制作了第一个正则表达式声明,而我的教程则说了第二个。对于给定的字符串,两者都产生相同的结果。有什么区别?这些代码将产生不同的结果的字符串是什么?
>>> f = 'From m.rubayet94@gmail.com sat Jan'
>>> y = re.findall('^From .*@(\S+)',f); print(y)
['gmail.com']
>>> y = re.findall('^From .*@([^ ]*)',f); print(y)
['gmail.com']
答案 0 :(得分:1)
[^ ]*
表示零个或多个非空格字符。
\S+
表示一个或多个非空白字符。
您似乎要匹配一个可能是电子邮件地址一部分的域名,因此第二个正则表达式是两者之间更好的选择,因为域名不能包含任何空白,例如制表符{{1} }和换行符\t
,而不仅仅是空格。 (域名也不能包含其他字符,但这不重要。)
以下是区别的一些示例:
\n
在第一种情况下,空白不能正确处理:import re
p1 = re.compile(r'^From .*@([^ ]*)')
p2 = re.compile(r'^From .*@(\S+)')
for s in ['From eric@domain\nTo john@domain', 'From graham@']:
print(p1.findall(s), p2.findall(s))
在第二种情况下,您将获得空匹配,而您不应该这样做:['domain\nTo'] ['domain']
答案 1 :(得分:0)
其中一个正则表达式使用[^ ]
,而另一个则使用(\S+)
。我认为那时您正在尝试与除空白以外的任何内容进行匹配。
两个表达式之间的区别在于(\S+)
可以与任何非空白字符匹配(空白字符为[ \t\n\r\f\v]
,您可以阅读更多here)。 [^ ]
将与任何非单个空格字符(即,按空格键产生的空格)相匹配。