我目前正在参加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
时,该模式效果很好。
感谢您的帮助!
答案 0 :(得分:0)
在你的正则表达式中,你有四组。首先,因为'@'周围的空格,在|,匹配之后,所以前两个组是空的,而后两个组用字母填充,如你所示。
答案 1 :(得分:0)
您可能会忘记在正则表达式模式中添加空格。使用与任何空格字符\s
匹配的[\r\n\t\f ]
。如果有一个或多个空格,请使用\s+
。
转义正则表达式中具有特殊含义的点并匹配任何字符(换行符除外)。
^
和$
检查该行的开头和结尾。
从索引1和2获取匹配的组。
^(\w+)\s@\s(\w+)\.edu$
示例代码:
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