Python如何按子串匹配规则将网址列表批量替换为对应应用名
实现方案
这个需求完全可以实现,因为待匹配的应用列表X总长度不到100,就算Y的总量超过10万条,遍历匹配也不会有明显的性能问题。
核心匹配逻辑说明
- 默认采用不区分大小写的子串匹配,符合你给出的示例效果(小写的microsoft匹配X中的Microsoft、GoldenApple中的Apple匹配X中的Apple)
- 示例中默认匹配到第一个符合条件的应用名就结束匹配,如果出现一个url同时包含多个X中的元素的场景,可以自行调整逻辑返回所有匹配结果,或者按优先级匹配。
基础实现代码(两层循环,易理解)
# 你的原始数据 X = ["Microsoft", "Apple", "Nike", "Adidas"] Y = ["microsoft.com/123", "microsoft.com/456", "GoldenApple.com", "nike.cn/home", "test.adidas.com/product"] # 提前把应用名转为小写,方便后续不区分大小写匹配 lower_x_list = [item.lower() for item in X] processed_Y = [] for url in Y: lower_url = url.lower() matched_app = None for index, lower_app_name in enumerate(lower_x_list): if lower_app_name in lower_url: # 匹配到就取X中对应的原应用名 matched_app = X[index] # 匹配到第一个就退出,如果要全匹配可以去掉这行break break # 没匹配到就保留原始url processed_Y.append(matched_app if matched_app else url) print(processed_Y)
运行后输出结果为:['Microsoft', 'Microsoft', 'Apple', 'Nike', 'Adidas']
高性能实现代码(正则预编译,适合Y数据量大的场景)
提前把所有应用名编译成正则表达式,一次扫描即可完成匹配,比两层循环性能更高:
import re X = ["Microsoft", "Apple", "Nike", "Adidas"] Y = ["microsoft.com/123", "microsoft.com/456", "GoldenApple.com", "nike.cn/home", "test.adidas.com/product"] # 拼接正则规则,re.escape避免应用名里有特殊正则字符导致匹配异常,re.IGNORECASE开启不区分大小写匹配 app_pattern = re.compile("|".join(map(re.escape, X)), flags=re.IGNORECASE) def url_replace(url: str) -> str: match_res = app_pattern.search(url) # 匹配到就返回匹配到的文本,没匹配到返回原url return match_res.group() if match_res else url processed_Y = [url_replace(u) for u in Y]
运行结果和基础版完全一致。
内容的提问来源于stack exchange,提问作者Counting JR
相关产品推荐
相关产品推荐

