2011-08-10 6 views
11

Xin lỗi nếu đây là một câu hỏi đơn giản, tôi vẫn còn khá mới mẻ với điều này, nhưng tôi đã dành một lúc để tìm kiếm câu trả lời và không tìm thấy gì cả. Tôi có một danh sách giống như một cái gì đó lộn xộn kinh hoàng này:Trong Python, làm cách nào để xóa khỏi danh sách bất kỳ phần tử nào chứa các loại ký tự nhất định?

['Organization name} ', '> (777) 777-7777} ', ' class="lsn-mB6 adr">1 Address, MA 02114 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4603114\'); ', 'Other organization} ', '> (555) 555-5555} ', ' class="lsn-mB6 adr">301 Address, MA 02121 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO CLAIM YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4715945\'); ', 'Organization} '] 

Và tôi cần phải xử lý nó để HTML.py có thể biến các thông tin trong đó vào một bảng. Đối với một số lý do, HTML.py không thể xử lý các phần tử quái vật (ví dụ: 'class = "lsn-serpListRadius lsn-fr">. 2 Miles} THÊM THÔNG TIN BẢN ĐỒ DANH SÁCH CỦA BẠN nếu (typeof (serps)! == \' undefined \ ') serps.arrArticleIds.push (\' 4603114 \ ');', v.v.) May mắn cho tôi, tôi không thực sự quan tâm đến thông tin trong các yếu tố quái vật và muốn loại bỏ chúng.

Tôi cố gắng viết một regex mà sẽ phù hợp với tất cả hơn hơn hai chữ hoàn toàn mũ từ, để xác định các yếu tố con quái vật, và nhận điều này:

re.compile('[^a-z]*[A-Z][^a-z]*\w{3,}') 

Nhưng tôi không biết làm thế nào để áp dụng điều đó để xóa các phần tử chứa các đối sánh với regex đó khỏi danh sách. Làm thế nào tôi sẽ làm điều đó/đó là đúng cách để đi về nó?

Trả lời

18

Tôi nghĩ rằng regex của bạn là không chính xác, để phù hợp với tất cả các mục có chứa tất cả-nắp lời với ba hoặc nhiều ký tự, bạn nên sử dụng một cái gì đó như thế này với re.search:

regex = re.compile(r'\b[A-Z]{3,}\b') 

Với nó, bạn có thể lọc sử dụng một danh sách hiểu hoặc filter tích hợp chức năng:

full = ['Organization name} ', '> (777) 777-7777} ', ' class="lsn-mB6 adr">1 Address, MA 02114 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4603114\'); ', 'Other organization} ', '> (555) 555-5555} ', ' class="lsn-mB6 adr">301 Address, MA 02121 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO CLAIM YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4715945\'); ', 'Organization} '] 
regex = re.compile(r'\b[A-Z]{3,}\b') 
# use only one of the following lines, whichever you prefer 
filtered = filter(lambda i: not regex.search(i), full) 
filtered = [i for i in full if not regex.search(i)] 

quả tìm kiếm trong danh sách sau đây (mà tôi nghĩ là những gì bạn đang tìm kiếm:

>>> pprint.pprint(filtered) 
['Organization name} ', 
'> (777) 777-7777} ', 
' class="lsn-mB6 adr">1 Address, MA 02114 } ', 
'Other organization} ', 
'> (555) 555-5555} ', 
' class="lsn-mB6 adr">301 Address, MA 02121 } ', 
'Organization} '] 
+0

Có sự khác biệt về tốc độ giữa hai dòng không? – NumenorForLife

4

Đầu tiên, lưu trữ regex của bạn, sau đó sử dụng một danh sách hiểu:

regex = re.compile('[^a-z]*[A-Z][^a-z]*\w{3,}') 
okay_items = [x for x in all_items if not regex.match(x)] 
+0

Điều này có vẻ như nó sẽ hoạt động, nhưng vì lý do nào đó nó trả về danh sách không có tên tổ chức khi sử dụng regex gốc của tôi và khi sử dụng FJ nó chỉ phun ra cùng danh sách mà tôi đưa vào. . – RSid

0

Hoặc rất giống nhau nhưng không có biên soạn regex:

from re import match 

ll = ['Organization name} ', '> (777) 777-7777} ', ' class="lsn-mB6 adr">1 Address, MA 02114 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4603114\'); ', 'Other organization} ', '> (555) 555-5555} ', ' class="lsn-mB6 adr">301 Address, MA 02121 } ', ' class="lsn-serpListRadius lsn-fr">.2 Miles} MORE INFO CLAIM YOUR LISTING MAP if (typeof(serps) !== \'undefined\') serps.arrArticleIds.push(\'4715945\'); ', 'Organization} '] 

filteredData = [x for x in ll if not match(r'[^a-z]*[A-Z][^a-z]*\w{3,}', x)] 

được sửa đổi:

from re import compile 

rex = compile('[^a-z]*[A-Z][^a-z]*\w{3,}') 
filteredData = [x for x in ll if not rex.match(x)] 
+0

Nếu bạn định chạy cùng một regex với nhiều mục trong danh sách, bạn * nên * biên dịch nó. Cấp, Python thường đủ thông minh để biên dịch nó cho bạn và lưu nó vào bộ nhớ cache, nhưng tốt nhất là phải rõ ràng. – Amber

1

mà không regex

def isNotMonster(x): 
    return not any((len(word) > 2) and (word == word.upper()) for word in x.split()) 

okay_items = filter(isNotMonster, all_items) 
+0

Điều này chỉ trả về tên của các tổ chức - mà thực sự cũng hữu ích cho tôi ngay bây giờ, do đó, cảm ơn riêng biệt, nhưng nó không phải là những gì tôi đang tìm kiếm. – RSid

0
element = 'string_to_search' 
for item in y_list_of_items: 
    if element in item: 
     y_list_of_items.remove(item)