如何用str.contains()过滤.co.类TLD网站?现有方法失效原因及解决方案
问题原因与解决方案:过滤特定二级域名后缀的网站
为什么你的方法失效?
正则表达式中的.默认匹配任意单个字符,这是核心问题:
- 直接用
'.co.'时,未转义的两个.会匹配任意字符,比如.com里co后面的m会被第二个.匹配,导致.com被误判为符合条件,最终被过滤。 - 即便转义成
'\.co\.'(或未加原始字符串前缀的'\\.co\\.'),如果转义操作有误(比如只转义了前一个.,没转义后一个),第二个.依然会匹配任意字符,还是会把.com包含进匹配结果。
更优解决方案
要精准过滤.co.uk、.co.at这类co作为二级后缀的域名,同时保留.com、.co,可以用锚定结尾的正则表达式,确保只匹配co后面跟着另一个后缀的情况:
方案1:匹配纯域名结尾的.co.xx模式
如果Website字段存储的是无路径的纯域名,用这个正则:
df_filtered = df.loc[~df['Website'].str.contains(r'\.co\.[a-z]{2,}$', case=False)]
正则说明:
r'\.co\.':用原始字符串r避免转义混乱,匹配字面意义的.co.[a-z]{2,}:匹配至少2个字母的顶级域名(如uk、at)$:锚定字符串结尾,确保这是域名的最后部分case=False:兼容大写域名(如.CO.UK)
方案2:兼容带路径的完整URL
如果Website包含完整URL(比如https://example.co.uk/page1),调整正则匹配.co.xx后面跟着斜杠或结尾:
df_filtered = df.loc[~df['Website'].str.contains(r'\.co\.[a-z]{2,}(?:/|$)', case=False)]
(?:/|$)表示匹配斜杠或字符串结尾,避免误匹配路径中出现的.co.(比如https://example.com/co.uk/)。
方案3:拆分域名(需额外库支持)
如果需要更严谨的域名解析,可使用tldextract库提取后缀:
import tldextract def should_filter(url): ext = tldextract.extract(url) # 过滤二级后缀为co的情况(如co.uk、co.at) return ext.suffix.split('.')[0] == 'co' df_filtered = df[~df['Website'].apply(should_filter)]
这个方法不受URL格式影响,解析更准确,但需先安装库:pip install tldextract
内容的提问来源于stack exchange,提问作者user655588
相关产品推荐
相关产品推荐

