[英]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.