Python正则表达式以排除电子邮件域和特殊字符,并在twitter中提取@user

Python正则表达式以排除电子邮件域和特殊字符,并在twitter中提取@user,python,regex,twitter,Python,Regex,Twitter,我有一个字符串twitter文本,如下所示: str = "RT@aquage_7: 田@tianke おっ(´・ω・`) @_@, @__田科, my email is tian@gmail.com, his@kate, I like @lucyさん, and her email is kate@163.cn". 正则表达式模式是: p_name3 = re.compile(r'[@@]([a-zA-Z0-9_]{1,15})') 但结果是: ['aquage_7', 'tia

我有一个字符串twitter文本,如下所示:

str = "RT@aquage_7: 田@tianke おっ(´・ω・`) @_@, @__田科,
 my email is tian@gmail.com, his@kate, I like @lucyさん, 
 and her email is kate@163.cn".
正则表达式模式是:

p_name3 = re.compile(r'[@@]([a-zA-Z0-9_]{1,15})')  
但结果是:

 ['aquage_7', 'tianke', '_', '__', 'gmail', 'kate', 'lucy', '163']   
我希望结果是:

 ['aquage_7', 'tianke', '__', 'kate', 'lucy']   
我的意思是我想排除电子邮件域名(请不要只关注这两个电子邮件域)和特殊字符,例如:

@_@",


此外,您应该知道twitter用户名包括:a-zA-Z0-9_u,总字符数在1到15之间。请帮我解决这个问题,麻烦我几天。提前感谢。

这里是本地Twitter的API用户提到解析(使用)的一个示例:

这会输出tweet本身:

RT @cnnbrk: Polls open in historic UK referendum; voters to decide if Britain stays in EU or becomes first country to exit bloc. https://t.…
以及实体(提及、哈希标签、URL等),为了更好地理解,我将其打印在这里:

{
    "symbols": [], 
    "user_mentions": [
        {
        "indices": [
            3, 
            10
        ], 
        "screen_name": "cnnbrk", 
        "id": 428333, 
        "name": "CNN Breaking News", 
        "id_str": "428333"
        }
    ], 
    "hashtags": [], 
    "urls": [
        {
        "url": "[url_here]", 
        "indices": [
            139, 
            140
        ], 
        "expanded_url": "[url_here]", 
        "display_url": "[url_here]"
        }
    ]
}

在您的例子中,有趣的部分是JSON中提到的
用户数组。

如果可以,请使用twitter API。但是,如果您正在寻找一个简单的字符串解决方案,请将问题分为两个步骤。首先,找到并删除任何可能的电子邮件地址,然后使用您的正则表达式查找twitter@提及

将第一封与regex from匹配的电子邮件改编为Python,如下所示:

>>> import re
>>> regex = re.compile(r'(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b')
(是的,将电子邮件地址与正则表达式匹配是一件令人担忧的事情,但它仍可能给您提供有用的结果。)将其应用于字符串

>>> s = """RT@aquage_7: @tianke おっ(´・ω・`) @_@, @__田科,
my email is tian@gmail.com, his@kate, I like @lucyさん, 
and her email is kate@163.cn"""
导致

>>> regex.findall(s)
['tian@gmail.com', 'kate@163.cn']
现在您已经找到了类似电子邮件的部分,请使用
re.sub
删除它们

>>> s = email_regex.sub('', s)
然后使用你原来的正则表达式来查找推特上提到的内容

>>> mention_regex = re.compile(r'[@@]([a-zA-Z0-9][a-zA-Z0-9_]{0,14})')
>>> print(mention_regex.findall(s))
['aquage_7', 'tianke', '_', '__', 'kate', 'lucy']

您不想在
@
中找到
'
,但是您的正则表达式确实与之匹配,因此,如果需要,请细化正则表达式。

它不是那么简单,因为它几乎完全是上下文关联的。像:
RT@gmail.can你修复了“我的收件箱”中的错误吗?
,当用户从我的收件箱中转发推文时,却忘了在这段时间后添加空格?从正则表达式的角度来看,
gmail
同样可以是有效用户或电子邮件地址的域
RT@gmail.can
。作为记录,你知道twitter的API可以直接返回@提及,而不必解析它们吗?谢谢你的支持comments@3kt,这是什么意思“twitter的API可以直接返回@提及,您是否有关于此的文档或链接?谢谢@TKTK0711你可以看看。返回的JSON有一个名为
user\u的字段
。请尝试。添加更多TLD以确保您仅禁止电子邮件-然而,这很难做到完美。不过可能已经足够好了。谢谢你的回答!这可能会给你带来麻烦或是不礼貌。如果我不想使用用户名,我想用Regex解析用户名。如何解决它。正如@pzp在你问题的评论中所说的,这肯定是很棘手的,我不认为你可以100%肯定在每种情况下都得到提及。我强烈建议使用现有的工具来恢复它们。。。Thanks@David,你是一个善良的人,如果有办法一步解决它是最好的。
>>> mention_regex = re.compile(r'[@@]([a-zA-Z0-9][a-zA-Z0-9_]{0,14})')
>>> print(mention_regex.findall(s))
['aquage_7', 'tianke', '_', '__', 'kate', 'lucy']