2
my_list = ['1 ab ac bbba','23 abcba a aabb ab','345 ccc ab aaaaa']

数字とスペース、基本的に「a」、「b」、または「c」以外のすべてを取り除こうとしています

私はこれを試しましたが、うまくいきませんでした。理由はわかりません:

for str in my_list:
    for i in str:
        if i != 'a' or 'b' or 'c':
            i = ''
        else:
            pass

私は最終的に取得したい:

my_list2 = ['abacbbba','abcbaaaabbab','cccabaaaaa']
4

3 に答える 3

3

あなたはどのように機能するかを誤解していますor:

if i != 'a' or 'b' or 'c':

と同等です

if (i != 'a') or ('b') or ('c'):

したがって、常にTrue( にb評価されるためTrue) になります。

あなたはおそらく書くつもりだった

if i != 'a' and i != 'b' and i != 'c':

次のように書くこともできます

if i not in ('a', 'b', 'c'):

または(文字列はその文字を反復できるため)

if i not in 'abc':

しかし、それでも、その情報を使って何もしていません。文字列は不変であり、に割り当てる''ことiで、文字列をまったく変更していません。したがって、正規表現なしで実行したい場合、正しい方法は次のようになります

>>> my_list = ['1 ab ac bbba','23 abcba a aabb ab','345 ccc ab aaaaa']
>>> new_list = [''.join(c for c in s if c in 'abc') for s in my_list]
>>> new_list
['abacbbba', 'abcbaaaabbab', 'cccabaaaaa']
于 2012-10-27T07:48:26.437 に答える
2

、、、または、以外のすべてを空の文字列re.subに置き換えるために使用します。abc[^abc]

import re
my_list2 = []
for str in my_list:
    my_list2.append(re.sub("[^abc]", "", str))

デモ

于 2012-09-24T00:02:14.193 に答える
0
  m = ['1 ab ac bbba','23 abcba a aabb ab','345 ccc ab aaaaa']
  n=[m[x][m[x].index(" "):] for x in range(len(m))]
  n=[x.replace(" ","") for x in n]
于 2012-10-27T07:22:21.577 に答える