Python Regex Pipe Findall

时间:2014-07-12 17:57:08

标签: python regex

我目前正在参加Coursera上提供的斯坦福NLP课程,而且我被困在家庭作业Spamlord上,这需要你构建一个正则表达式模式来解析电子邮件。我的模式是


(\w+)@(\w+).edu|(\w+)[^A-Za-z]@[^A-Za-z](\w+).edu

当我在测试字符串上运行" ashishg @ stanford.edu"没有像我预期的那样返回元组[(u'ashishg', u'stanford')],但[(u'', u'', u'ashishg', u'stanford')] 。为什么这样做?我知道它与\ w +字符有某种关系,因为当我用" Hello"这样的随机字符串替换(\w+)@(\w+).edu时,该模式效果很好。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

在你的正则表达式中,你有四组。首先,因为'@'周围的空格,在|,匹配之后,所以前两个组是空的,而后两个组用字母填充,如你所示。

答案 1 :(得分:0)

  • 您可能会忘记在正则表达式模式中添加空格。使用与任何空格字符\s匹配的[\r\n\t\f ]。如果有一个或多个空格,请使用\s+

  • 转义正则表达式中具有特殊含义的点并匹配任何字符(换行符除外)。

  • ^$检查该行的开头和结尾。

从索引1和2获取匹配的组。

^(\w+)\s@\s(\w+)\.edu$

Online demo

示例代码:

import re
p = re.compile(ur'(\w+)\s@\s(\w+)\.edu')
test_str = u"ashishg @ stanford.edu"

re.match(p, test_str)

输出:

1.  [0-7]   `ashishg`
2.  [10-18] `stanford`

如果您正在寻找以下输出,请尝试替换:

[(u'ashishg',u'stanford')]

示例代码:

import re
p = re.compile(ur'(\w+)\s@\s(\w+)\.edu')
test_str = u"ashishg @ stanford.edu"
subst = u"[(u'$1',u'$2')]"

result = re.sub(p, subst, test_str)

  

当我用" Hello"这样的随机字符串替换(\w+)@(\w+).edu时,模式效果很好。

在这种情况下,您的第二个正则表达式模式是ORed,匹配这两个组,但不需要第二个正则表达式模式。

(\w+)[^A-Za-z]@[^A-Za-z](\w+).edu