如何从 Pandas DataFrame 中提取 URL?

Raz*_*Haq 2 python regex dataframe pandas

我需要从使用以下值创建的 DataFrame 列中提取 URL

\n\n
creation_date,tweet_id,tweet_text\n2020-06-06 03:01:37,1269102116364324865,#Webinar: Sign up for @SumoLogic\'s June 16 webinar to learn how to navigate your #Kubernetes environment and unders\xe2\x80\xa6 /sf/ask/2956636651/\n2020-06-06 01:29:38,1269078966985461767,"In this #webinar replay, @DisneyStreaming\'s @rothgar chats with @SumoLogic\'s @BenoitNewton about how #Kubernetes is\xe2\x80\xa6 /sf/ask/3285004551/\n
Run Code Online (Sandbox Code Playgroud)\n\n

列名称tweet_text包含 URL。我正在尝试以下代码。

\n\n
df["tweet_text"]=df["tweet_text"].astype(str)\npattern = r\'https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)\'\n\ndf[\'links\'] = \'\'\ndf[\'links\']= df["tweet_text"].str.extract(pattern, expand=True)\n\nprint(df)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在使用这个问题的答案中的正则表达式,它与两行中的 URL 匹配。截屏\n但我得到的NaN是新列的值df[\'links]\'。我也尝试过这个问题的第一个答案中提供的解决方案,即

\n\n
df[\'links\']= df["tweet_text"].str.extract(pattern, expand=False).str.strip()\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到以下错误

\n\n
AttributeError: \'DataFrame\' object has no attribute \'str\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后我使用创建了一个空列df[\'links\'] = \'\',因为我收到ValueError: Wrong number of items passed 2, placement implies 1错误。如果那是相关的。\n有人可以帮我吗?

\n

Wik*_*żew 6

主要问题是您的 URL 模式包含捕获组,而您需要非捕获组。您需要将模式中的所有(内容替换为。(?:

然而,这还不够,因为str.extract需要模式中的捕获组,以便它可以返回任何值。因此,您需要用捕获组包装整个模式。

您可以使用

pattern = r'(https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}[-a-zA-Z0-9()@:%_+.~#?&/=]*)' 
Run Code Online (Sandbox Code Playgroud)

请注意,+不必在字符类中进行转义。另外,不需要//在字符类内部使用,一个/就足够了。