web-dev-qa-db-ja.com

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 Miles}詳細情報(typeof(serps)!== \' undefined\')serps.arrArticleIds.Push(\' 4603114\');'など)。私にとって幸いなことに、私は実際にはモンスターの要素の情報を気にせず、それらを取り除きたいと思っています。

モンスターの要素を特定するために、2文字を超えるすべて大文字の単語に一致する正規表現を書いてみたところ、次のようになりました。

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

しかし、その正規表現との一致を含む要素をリストから削除するためにそれを適用する方法がわかりません。それをどのように行うのですか/それを行うのに正しい方法ですか?

21
RSid

あなたの正規表現は正しくないと思います。3文字以上のすべて大文字の単語を含むすべてのエントリに一致させるには、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} ']
31
Andrew Clark

まず、正規表現を保存してから、リスト内包表記を使用します。

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

またはまったく同じですが、正規表現をコンパイルしません。

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

正規表現なし

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

okay_items = filter(isNotMonster, all_items)
1
Simon Bergot
element = 'string_to_search'
for item in y_list_of_items:
    if element in item:
        y_list_of_items.remove(item)
0
Ajay