繁体   English   中英

如果 python 中的关键字匹配,如何迭代列表并删除一些项目

[英]How to iterate on a list and remove some items if keyword matches in python

所以我有一个列表,其中包含某些人的 linkedin 网址。 但是,该列表还包含一些 facebook 和 twitter 网址。

allsocialmediaURLS= [] # this list contains 500 items, all urls.

如何使用 python 删除 facebook 和 twitter 网址?

到目前为止,这是我尝试过的:

for querylink in allsocialmedialinks:
    query = querylink
    stopwords = ['facebook', 'twitter']
    querywords = query.split()

    resultwords  = [word for word in querywords if word.lower() not in stopwords]
    result = ' '.join(resultwords)

    print(result)

Output:没有变化。 结果我仍然从原始的 lsocialmedialinks 列表中获取所有 url。

默认情况下, querywords = query.split()中使用的split()方法按空格拆分。 因此,由于您的网址可能不包含空格,因此数组不会拆分,因此它与您的停用词不匹配。

我建议按/或 拆分. 取决于您的网址的实际外观。

假设一个链接的格式是https://www.socialmedia.com/in/someone-42/ ,你用一个空格分开,不会给你一个包含超过 1 个元素的列表,因为没有空格开始。

尝试拆分. 并过滤掉您不想要的链接。 例如:

for querylink in allsocialmedialinks:
    query = querylink
    stopwords = ['facebook', 'twitter']
    querywords = query.split('.')
   
    if any([stopword in querywords for stopword in stopwords]):
        continue
    result.append('.'.join(querywords))

当且仅当社交媒体名称被明确提及并且具有前缀和尾部时,上述代码才会过滤掉停用词链接. 对于www.twitter.com/some_tweet中的关键字

此建议不会从原始列表中删除 URL。 相反,它会创建一个新列表。 此外,它试图通过(有效地)验证所有 URL 来消除歧义。 进一步解释见代码后的output。

import re


def removeURLs(myURLS, ignore):
    rv = []
    cre = re.compile(
        '^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?')
    for url in myURLS:
        if (m := cre.search(url)) and (g := m.groups()[3]):
            if any(i.lower() in g.lower() for i in ignore):
                continue
        rv.append(url)
    return rv


URLS = ['www.facebook.com',
        'http://www.twitter.com', 'https://www.bbc.co.uk']
IGNORE = ['facebook', 'Twitter']

print(removeURLs(URLS, IGNORE))

output 将是:-

['www.facebook.com', 'https://www.bbc.co.uk']

请注意,包含“www.facebook.com”是因为根据严格定义,它不是 URL

这是一个递归的 function,它会检查您的停用词并返回没有这些词的网址。

def remove_stopwords(urls, stopwords, index=0):
    tmp_list = [i for i in urls if stopwords[index] not in i]
    if index == len(stopwords) - 1:
        return tmp_list
    return remove_stopwords(tmp_list, stopwords, index=index+1)

为了测试这一点,这里有一些随机的 url:

import numpy as np
stopwords = ['facebook', 'twitter']
rnd = np.random.default_rng(12345)
urls1 = ['https://linkedin.com/in/' + ''.join(i) + '' for i in rnd.choice([i for i in 'adbcedfghijklmnopqrstuvwxyz'], [5, 10])]
urls2 = ['https://twitter.com/' + ''.join(i) + '' for i in rnd.choice([i for i in 'adbcedfghijklmnopqrstuvwxyz'], [5, 7])]
urls3 = ['https://facebook.com/profile.php?id=' + ''.join(i) for i in rnd.choice([str(i) for i in np.arange(9)], [5, 10])]
urls = urls1 + urls2 + urls3
urls

# Output
#['https://linkedin.com/in/rfuhduqrzj',
# 'https://linkedin.com/in/vhopddfrpy',
# 'https://linkedin.com/in/sfxysrcbgk',
# 'https://linkedin.com/in/dwlrdhcstd',
# 'https://linkedin.com/in/sbjetilllg',
# 'https://twitter.com/ovmdacb',
# 'https://twitter.com/bcpuwqp',
# 'https://twitter.com/hyqsswr',
# 'https://twitter.com/ynnfynm',
# 'https://twitter.com/hgqloqx',
# 'https://facebook.com/profile.php?id=2684223527',
# 'https://facebook.com/profile.php?id=3000532504',
# 'https://facebook.com/profile.php?id=5013283517',
# 'https://facebook.com/profile.php?id=1643442128',
# 'https://facebook.com/profile.php?id=2627451546']


remove_stopwords(urls, stopwords)
# Output

# ['https://linkedin.com/in/rfuhduqrzj',
# 'https://linkedin.com/in/vhopddfrpy',
# 'https://linkedin.com/in/sfxysrcbgk',
# 'https://linkedin.com/in/dwlrdhcstd',
# 'https://linkedin.com/in/sbjetilllg']

当然,这假设您的网址总是像您在 OP 中提到的那样属于某些人。 因此,如果您的 url 类似于https://linkedin.com/in/somefacebookuser ,这将失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM