我正在通過正則運算式過濾列,該運算式檢查串列中的某些短語是否存在于文本欄位中:
phrase = ["email was deleted", "click on link", etc.]
df['text'].str.contains(r'\b(?:{})\b'.format('|'.join(sorted(phrase, key=len, reverse=True))), case=False, regex=True)
但是,現在我想添加一個條件來排除前面有短語/單詞串列的任何結果:
neg_phrases = ["did not", "not", "no"]
因此,我希望在文本中的任何位置都出現一行帶有“史蒂夫告訴瑪麗電子郵件被洗掉”的行,但是如果它是“史蒂夫告訴瑪麗沒有洗掉電子郵件”,那么它不應該。只是不知道如何在消極的后視中作業
uj5u.com熱心網友回復:
考慮到您的字串中沒有空格問題(沒有雙空格,所有空格都是常規\x20空格),您可以使用
pattern = r'\b(?<!{} )(?:{})\b'.format(' )(?<!'.join(neg_phrases),'|'.join(sorted(phrase, key=len, reverse=True)))
請參閱正則運算式演示。
該\b(?<!did not )(?<!not )(?<!no )(?:email was deleted|click on link)\b模式將僅匹配email was deleted,或者click on link如果不是緊跟在前面did not,not或者no后面跟一個空格。
您還可以將文字空格替換為\s以匹配任何空格:
pattern = r'\b(?<!{}\s)(?:{})\b'.format('\s)(?<!'.join(neg_phrases),'|'.join(sorted(phrase, key=len, reverse=True)))
如果您的短語可以包含特殊字符,則它們需要是re.escaped,replace sorted(phrase, key=len, reverse=True)withsorted(map(re.escape, phrase), key=len, reverse=True)并用自適應動態詞邊界替換詞邊界:
pattern = r'(?!\B\w)(?<!{}\s)(?:{})(?<!\w\B)'.format('\s)(?<!'.join(map(re.escape, neg_phrases)),'|'.join(sorted(map(re.escape, phrase), key=len, reverse=True)))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/427074.html
上一篇:用平面切割網格的演算法
