2013-03-15 58 views
6

Tôi đang cố gắng đối sánh và xóa tất cả các từ trong danh sách khỏi chuỗi bằng regex được biên dịch nhưng tôi đang cố gắng tránh các lần xuất hiện trong từ.Xóa tất cả các lần xuất hiện của chuỗi trong một chuỗi từ danh sách python

hiện tại:

REMOVE_LIST = ["a", "an", "as", "at", ...] 

remove = '|'.join(REMOVE_LIST) 
regex = re.compile(r'('+remove+')', flags=re.IGNORECASE) 
out = regex.sub("", text) 

Trong: "Các cáo nâu nhanh chóng nhảy qua một con kiến"

Out: "con cáo nâu nhanh chóng nhảy qua t"

mong đợi: "con cáo màu nâu nhanh chóng nhảy qua"

Tôi đã thử thay đổi chuỗi để biên dịch thành những nội dung sau nhưng không có kết quả:

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE) 

Bất kỳ đề xuất nào hoặc tôi thiếu điều gì đó rõ ràng rõ ràng?

+0

lẽ 'ant' là một phần của bạn xóa danh sách? –

Trả lời

8

Một vấn đề là chỉ có \b đầu tiên nằm bên trong một chuỗi thô. Thứ hai được hiểu là ký tự backspace (ASCII 8) chứ không phải là một ranh giới từ.

Để khắc phục, thay đổi

regex = re.compile(r'\b('+remove+')\b', flags=re.IGNORECASE) 

để

regex = re.compile(r'\b('+remove+r')\b', flags=re.IGNORECASE) 
           ^THIS 
+1

Là một mẹo để khám phá điều này (ngoài việc biết điều này trước), hãy xuất mẫu bằng 'regex.pattern' – nhahtdh

+0

Đẹp một NPE. Cảm ơn! – Ogre

16

đây là một gợi ý mà không sử dụng regex bạn có thể muốn xem xét:

>>> sentence = 'word1 word2 word3 word1 word2 word4' 
>>> remove_list = ['word1', 'word2'] 
>>> word_list = sentence.split() 
>>> ' '.join([i for i in word_list if i not in remove_list]) 
'word3 word4' 
+0

Groovy. Đã không nghĩ về điều đó. Cảm ơn :) – Ogre

+0

Điều đáng nói là điều này sẽ gặp khó khăn với dấu chấm câu và sẽ không giữ lại các tab/khoảng trống liên tiếp (không chắc chắn nếu tab sau là quan trọng). – NPE

+3

Cần lưu ý rằng nếu 'remove_list' là lớn, bạn sẽ tốt hơn với' remove_set = {'word1', 'word2', ...} 'như các bộ có các bài kiểm tra thành viên nhanh hơn nhiều. –

Các vấn đề liên quan