首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止将短字符串添加到集合中

如何防止将短字符串添加到集合中
EN

Stack Overflow用户
提问于 2014-10-31 02:33:25
回答 2查看 33关注 0票数 0

我正试着解析一些文本文件中的电子邮件。基于https://gist.github.com/dideler/5219706,我有:

代码语言:javascript
复制
def getEmails(freeText):

    r = re.compile(("([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`"
                        "{|}~-]+)*(@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(\.|"
                        "\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)"))

    results = r.findall(freeText)
    myset = set() # USING A SET AVOIDS DUPLICATES
    for x in results:
        if len(x)>2:
            myset.add(str(x))

    return myset

这很好用,但是我得到了一组看起来像:

代码语言:javascript
复制
"('myname@abc.org', '@', '.')

我加了一句:

代码语言:javascript
复制
if len(x)>2:

希望这将消除返回集的单个字符结果,但正如您所看到的,它不起作用。为什么不行?我怎么才能解决这个问题才能得到真正的电子邮件呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-31 02:37:47

你不需要检查长度。在两个捕获组之间转换为非捕获组,如下所示。

代码语言:javascript
复制
([a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*(?:@|\sat\s)(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.|\sdot\s))+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)
                                                                   ^                                              ^
                                                                   |                                              |

演示

票数 2
EN

Stack Overflow用户

发布于 2014-10-31 02:43:07

如果仔细查看您发送的链接中的程序(第28行),您会发现它们只使用regex结果元组的第一个元素。

所以你可能想要改变这个:

代码语言:javascript
复制
for x in results:
    if len(x)>2:
        myset.add(str(x))

转入:

代码语言:javascript
复制
for x in results:        
    if len(x[0])>2:
        myset.add(x[0])

...or只是改变了正则表达式

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26666700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档