pythonでMeCabで文章の処理をかけています。

for text in df["msg_body"]:
    for line in mecab.parse(text).rstrip().splitlines():
        items = line.split("\t")
        if len(items) == 2:
            surface, feature = items
            if re.search("^(名詞|動詞,自立)", feature) and not\ 
                         re.search("^(BOS/EOS|名詞,数|記号)", feature):
                small_list.append(surface)
            else:
                surface=" "                    
                small_list.append(surface)

のように、対象の文章から、名詞と動詞のみ(名詞は数字と記号は抜かす)ように条件を与えています。
ですが、出力結果の品詞をカウントしてみると、

['名詞', '一般', '*']        216
['動詞', '自立', '*']        139
['名詞', '固有名詞', '一般']     121
['名詞', 'サ変接続', '*']       63
['名詞', '固有名詞', '組織']      29
['名詞', '固有名詞', '人名']      28
['名詞', '固有名詞', '地域']      24
['副詞', '一般', '*']          7
['形容詞', '自立', '*']         7
['名詞', '形容動詞語幹', '*']      5

と、除外した単語が入ってきます。
これはどうしてでしょうか?
MeCabではこのような不安定な挙動があるのでしょうか?
もしくはコードが間違えているのでしょうか?
よろしくお願いします。

追記 (コメントへの返信)

feature には何が入っていますか? MeCab のインスタンスはどうやって生成していますか?

featureはコードの通りです。mecab = MeCab.Tagger("-b 5242880")でパースしたものは基本的に単語と品詞(ここではsurfaceとfeature)に分けられますので。mecabインスタンスは上記のとおりです。dfはテキストが入っているデータフレームです。small_listは条件をクリアした単語のみ格納するただのリストです。

条件を満たすものは surface だけしか集めていないのに、どうやってフィルター後の feature を数えているのですか?

残った単語を再度パースしているだけです。