使用正则表达式从Twitter文本数据中提取@用户和网址链接的Python代码

3

有一个包含推特文本数据的字符串列表,例如以下数据(实际上有大量文本,不仅限于这些数据),我想提取推特文本中所有以@开头的用户名和URL链接,例如:galaxy5univ和url链接。

   tweet_text = ['@galaxy5univ I like you',
    'RT @BestOfGalaxies: Let's sit under the stars ...',
    '@jonghyun__bot .........((thanks)',
    'RT @yosizo: thanks.ddddd <https://yahoo.com>',
    'RT @LDH_3_yui: #fam, ccccc https://msn.news.com']

我的代码:

import re
pu = re.compile(r'http\S+')
pn = re.compile(r'@(\S+)')
for row in twitter_text:
   text = pu.findall(row)
   name = (pn.findall(row))
   print("url: ", text)
   print("name: ", name)

在大量的推特数据中测试代码后,我发现我的两个模式用于提取URL和名称都是错误的(尽管在一些推特文本数据中是正确的)。你们有没有关于在大量推特数据情况下从推特文本中提取名称和URL的文件或链接?

如果您对从推特数据中提取名称和URL有建议,请告诉我,谢谢!


1
pn = re.compile(r'@([a-zA-Z0-9_]+)') - mic4ael
感谢您的评论,您知道Twitter数据中有大量的名称数据。有时这些名称包含一些特殊字符,例如# % ^,而不仅仅是a-zA-Z0-9_。在这种情况下,应该如何解决? - tktktk0711
1
只需将它们添加到方括号内的字符列表中,但请记住某些字符需要正确转义。 - mic4ael
谢谢您的评论,但我必须将所有字符添加到方括号中。如果我不知道@后面的字符,该怎么办呢?希望有有效的方法来解决它(删除名称末尾的“:”)。 - tktktk0711
你的意思是获取 @ 后面所有非空白字符但不包括 : 吗?你可以使用 r'@([^\s:]+)' - Wiktor Stribiżew
显示剩余3条评论
2个回答

5
请注意,您的pn = re.compile(r'@(\S+)')正则表达式将捕获@后面的任何1个或多个非空格字符。
要排除匹配:,您需要将简写的\S类转换为[^\s]否定字符类等效,并将:添加到其中。
pn = re.compile(r'@([^\s:]+)')

现在,它将停止在第一个:之前捕获非空格符号。请参见正则表达式演示
如果您需要捕获到最后一个:,只需在捕获组后添加:pn = re.compile(r'@(\S+):')
至于匹配URL的正则表达式,有许多选择适合您的即可。
这里是一个示例代码
import re
p = re.compile(r'@([^\s:]+)')
test_str = "@galaxy5univ I like you\nRT @BestOfGalaxies: Let's sit under the stars ...\n@jonghyun__bot .........((thanks)\nRT @yosizo: thanks.ddddd <https://y...content-available-to-author-only...o.com>\nRT @LDH_3_yui: #fam, ccccc https://m...content-available-to-author-only...s.com"
print(p.findall(test_str)) 
p2 = re.compile(r'(?:http|ftp|https)://(?:[\w_-]+(?:(?:\.[\w_-]+)+))(?:[\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?')
print(p2.findall(test_str))
# => ['galaxy5univ', 'BestOfGalaxies', 'jonghyun__bot', 'yosizo', 'LDH_3_yui']
# => ['https://yahoo.com', 'https://msn.news.com']

现在,我已经发现我的两个用于URL和名称的模式都是错误的。你们有没有一些关于从Twitter文本中提取名称和URL的文档或链接? - tktktk0711
“@([^\s:]+)”有什么问题?可以在任何地方找到URL的正则表达式。这里是一个很好的资源。这里还有一个关于在较大文本中匹配URL的SO线程。**请参见此IDEONE演示**。 - Wiktor Stribiżew
1
对不起,我从未见过带有空格的用户名。这意味着您需要使用@(.*):,是吗?如果不是,请解释一下这些用户名所属的模式。如果没有模式,则无法匹配它们。此外,这里有一个链接,指向Twitter JS库中使用的提及正则表达式(该模式与Python兼容)。 - Wiktor Stribiżew
感谢@Wiktor Stribiżew。我将使用您的代码来测试大量的Twitter数据。稍后我会汇报结果。 - tktktk0711
请使用我提供的链接中的URL正则表达式。匹配URL是一个早已解决的问题。或者将您认为必须匹配的内容发布出来,但是我的答案中的url正则表达式无法获取。 - Wiktor Stribiżew
显示剩余3条评论

1
如果用户名不包含特殊字符,您可以使用以下方法:
@([\w]+)

请参见实时演示

感谢您的评论。我知道我提取Twitter文本中@后面的名称和URL链接的两种模式是错误的。您知道名称和URL链接有很多不同的形式。如果您有相关的文档或链接,请告诉我! - tktktk0711

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接