正则表达式的字符串类型应该是什么:'\ S +?@ \ S +'

时间:2017-05-20 12:44:16

标签: python regex

让我们说给定的字符串是: 来自stephen.marquard@uct.ac.za 2008年1月5日星期六09:14:16

根据我的回答应该是:d@uct.ac.za 因为非空白字符的数量应该是懒惰的贪婪(尽可能少)因此。 但是python说:stephen.marquard@uct.ac.za

import re
hand = open('textfile.txt')
for line in hand:
    line=line.rstrip()
    x=re.findall('\S+@\S+',lin)
    if x:
      print x

和textfile.txt是:

From stephen.marquard@uct.ac.za Sat Jan  5 09:14:16 2008

5 个答案:

答案 0 :(得分:0)

如果您只想在@之前使用一个字符,则可以使用:

'\S@\S+'

非贪婪并不意味着正则表达式会尝试通过改变起始索引来找到最短的子字符串。它只是意味着如果有一个从索引0开始并与正则表达式匹配的子字符串,引擎将尽快停止。

答案 1 :(得分:0)

当你说:

  

非空白字符的数量应该是懒惰的贪婪(尽可能少)因此。

在你的情况下,它暗示它应该是一个或零

因此,使用optional量词制作非空白字符?将完成这项工作。

尝试使用\S?@\S+

<强> Regex101 Demo

答案 2 :(得分:0)

我想我对此有答案。趋势有点晚了,但是就这样。

首先让我们参考Eric的声明: 非贪婪...仅表示如果有一个从索引0开始并与正则表达式匹配的子字符串,引擎将尽快停止。

好吧伙计。因此,引擎从索引0开始。它读取stephen.marquard,但仍未到达@,因此它继续进行,但是还没有任何东西认为它的选择错误,因此将其保留在内存中。

到达@符号。大。 \ S +?不会在@之前影响,但会在@之后影响,因为引擎从左到右读取。当它在@uct中到达u时,它已满足要求,因此从此处停止。在阅读stephen.marquard @时,它仍然没有。

答案 3 :(得分:0)

它将提取以下“ stephen.marquard@uct.ac.za” 因为?符号只能在@之后使用,

答案 4 :(得分:-1)

我也有同样的问题,但尚未回答。 非贪婪的“?”适用于'@'之后的内容,但不适用于它之前的内容。我对此没有任何解释。

您可以尝试[^ ]@[^ ]+来获得所需/期望的答案。