这些正则表达式之间的区别是什么:'^ From。* @([^] *)'和'^ From。* @(\ S +)'?

时间:2019-12-21 03:08:57

标签: python regex

我正在用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']

2 个答案:

答案 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)。 [^ ]将与任何非单个空格字符(即,按空格键产生的空格)相匹配。