Python:使用regex或其他方法提取url

2024-03-29 14:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我被一个问题难住了。我有一个很大的数据框,其中两列是这样的:

pd.DataFrame([['a', 'https://gofundme.com/ydvmve-surgery-for-jax,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],          ['b','https://twitter.com/dog_rates/status/890971913173991426/photo/1,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],['c','https://twitter.com/dog_rates/status/890971913173991430/video/1'] ],columns=['ID','URLs'])

我要做的是在每个单元格中只保留包含“twitter”一词的URL,然后删除其余的。其模式是,我想要的url总是包含单词“twitter”,并以“/”+一位数字结尾。如果在同一单元格中有两个相同的URL,则只应保留一个URL。像这样:

Test2 = pd.DataFrame([['a', 'https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
 ['b','https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
 ['c','https://twitter.com/dog_rates/status/890971913173991430/video/1'] ],columns=['ID','URLs'])

Test2

我是Python的新手,在google了很多次之后,我开始明白了一个叫做regex的东西是答案,但这就是我要做的。Stackoverflow的一个帖子把我带到了regex101.com,在玩了一番之后,我就来了,它不起作用了:

r’^[https]+(:)(//)(.*?)(/)(\d)’

有人能告诉我怎么解决这个问题吗? 提前谢谢。你知道吗


Tags: columnshttpscomidurldataframevideostatus
1条回答
网友
1楼 · 发布于 2024-03-29 14:27:51

正则表达式对于这样的任务来说当然很方便。有关详细信息,请参阅this questionregex101等在线工具。你知道吗

您当前的模式不正确,因为:

  • ^匹配字符串开头的以下模式。你知道吗
  • [https]+这是一个字符集,意味着它将匹配hsps,因此[]括号中出现的一个或多个字母的任何组合,而不仅仅是字符串httphttps,这是您所追求的。你知道吗
  • (:)您不需要将这个:放在这里的捕获组中。你知道吗
  • (//)/需要在regex中转义,\/。这里也不需要抓人。你知道吗
  • (.*?).*?组合经常被误用,因为可以使用否定的字符集[^]。你知道吗
  • (/)如上所述。你知道吗
  • (\d)匹配并捕获一个数字。这里的捕获组对于您的任务来说也是多余的。你知道吗

可以使用以下表达式:

https?:\/\/twitter\.com[^,]+(?<=\/\d$)
  • https?匹配文字子串httphttps。你知道吗
  • :\/\/twitter\.com匹配文字子串://twitter.com。你知道吗
  • [^,]+任何不是逗号的东西,一个或多个。你知道吗
  • (?<=\/\d$)正面回顾。断言在字符串$的末尾存在一个/,后跟一个数字\d。你知道吗

正则表达式演示here。你知道吗


Python演示:

import pandas as pd

df = pd.DataFrame([['a', 'https://gofundme.com/ydvmve-surgery-for-jax,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
                   ['b','https://twitter.com/dog_rates/status/890971913173991426/photo/1,https://twitter.com/dog_rates/status/890971913173991426/photo/1'],
                   ['c','https://twitter.com/dog_rates/status/890971913173991430/video/1'] ],columns=['ID','URLs'])

df['URLs'] = df['URLs'].str.findall(r"https?:\/\/twitter\.com[^,]+(?<=\/\d$)").str[0]
print(df)

印刷品:

  ID                                                             URLs
0  a  https://twitter.com/dog_rates/status/890971913173991426/photo/1
1  b  https://twitter.com/dog_rates/status/890971913173991426/photo/1
2  c  https://twitter.com/dog_rates/status/890971913173991430/video/1

相关问题 更多 >