2011-08-10 7 views
11

Przepraszam, jeśli to proste pytanie, wciąż jestem do tego nowicjuszem, ale spędziłem trochę czasu szukając odpowiedzi i niczego nie znalazłem. Mam listę, która wygląda mniej więcej tak przerażający bałagan:W Pythonie, w jaki sposób usunąć z listy element zawierający pewne rodzaje znaków?

['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} '] 

I muszę go przetworzyć tak, że HTML.py może przekształcić informacje w nim na stole. Z jakiegoś powodu, HTML.py po prostu nie może obsłużyć elementów potworów (np. "Class =" lsn-serpListRadius lsn-fr ">. 2 mile} WIĘCEJ INFORMACJI O SWOJEJ MAPIE LISTY, jeśli (typeof (serps)! == \ ' undefined \ ') serps.arrArticleIds.push (\' 4603114 \ ');', itp.). Na szczęście dla mnie nie dbam o informacje w elementach potworów i chcę się ich pozbyć.

Próbowałem pisać regex, które pasują do wszystkich bardziej niż dwuliterowy wszystkie kapitalizacji słowy, aby zidentyfikować elementy potwór, i dostaje to:

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

Ale ja nie wiem jak zastosuj to do usunięcia elementów zawierających dopasowania do tego wyrażenia regularnego z listy. Jak mam to zrobić/czy jest to właściwy sposób postępowania?

Odpowiedz

18

Myślę, że Twój regex jest nieprawidłowa, aby dopasować wszystkie wpisy, które zawierają wszystkie-Cap rozmowę z trzech lub więcej znaków, należy użyć coś takiego z re.search:

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

z tym można filtrować za pomocą listowego lub filter funkcja wbudowana:

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)] 

Wyniki w poniższej listy (co moim zdaniem jest to, czego szukasz:

>>> 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

Czy są jakieś różnice w prędkości między tymi dwoma liniami? – NumenorForLife

4

Najpierw zapisać regex, a następnie użyć wyrażeń listowych:

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

Wydawało się, że powinna działać, ale z jakiegoś powodu to zwraca listę bez nazwisk org podczas używania oryginalnego regex i kiedy korzystali tylko wypluwa samej listy FJ za I umieścić w. Nie wiem, dlaczego . – RSid

0

Albo ta sama, ale bez kompilowania 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)] 

edycja:

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

Jeśli zamierzasz używać tego samego wyrażenia regularnego wobec wielu elementów na liście, musisz * skompilować go. Oczywiście, Python jest zwykle wystarczająco inteligentny, aby skompilować go dla ciebie i przechowywać go w pamięci podręcznej, ale dobrze jest być wyraźnym. – Amber

1

bez 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

Powoduje to zwrócenie tylko nazw organizacji - co obecnie jest dla mnie pomocne, więc osobno dziękuję, ale nie tego szukałem. – RSid

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