В Python, как удалить из списка любой элемент, содержащий определенные типы символов?

Извините, если это простой вопрос, я до сих пор довольно новичок в этом, но я потратил некоторое время на поиск ответа и ничего не нашел. У меня есть список, который похож на этот ужасный беспорядок:

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

И мне нужно обработать его, чтобы HTML.py мог превратить информацию в нее в таблицу. По какой-то причине HTML.py просто не может обрабатывать элементы монстра (например, class= "lsn-serpListRadius lsn-fr" > . 2 мили} ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ ВАШЕЙ ЛИСТИНГОВОЙ КАРТЫ if (typeof (serps)! ==\'undefined \') serps.arrArticleIds.push(\ '4603114 \'); 'и т.д.). К счастью для меня, я действительно не забочусь об информации в элементах монстра и хочу избавиться от них.

Я попробовал написать регулярное выражение, которое соответствовало бы всем более чем двухбуквенным буквам all-caps, чтобы идентифицировать элементы монстров и получило следующее:

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

Но я не знаю, как применить это к удалению элементов, содержащих совпадения, с этим регулярным выражением из списка. Как я могу это сделать, это правильный способ сделать это?

Ответ 1

Я думаю, что ваше регулярное выражение неверно, чтобы соответствовать всем записям, содержащим все слова с тремя или более символами, вы должны использовать что-то вроде этого с помощью re.search:

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

С этим вы можете фильтровать, используя понимание списка или встроенную функцию filter:

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

Результаты в следующем списке (я думаю, это то, что вы ищете:

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

Ответ 2

Сначала сохраните ваше регулярное выражение, а затем используйте понимание списка:

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

Ответ 3

без регулярного выражения

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

okay_items = filter(isNotMonster, all_items)

Ответ 4

Или то же самое, но без компиляции регулярного выражения:

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

Отредактировано:

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

Ответ 5

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