2016-08-12 6 views
1

私はPythonの "マッチオブジェクト"で文字列を検索したいが、 ".find"は機能しない。ここに私の抜粋です:Pythonのマッチオブジェクトの文字列を見つける

e_list = [] 
for file in os.listdir('.'): 
    r = re.compile(r".*\.(aaa|bbb)$") 
    e_found = r.search(file) 
    if e_found is not None: 
     e_list.append(e_found.group(0)) 

e_length = len(e_list); 

for num_e in range(e_length): 
    if(e_list[num_e].group(0).find('50M') > 0) 
     print(e_list[num_e].group(0)) 

...今e_listはのようなものです:私は結果を持って期待してい

[<_sre.SRE_Match object; span=(0, 7), match='30M.aaa'>, 
<_sre.SRE_Match object; span=(0, 7), match='40M.bbb'>, 
<_sre.SRE_Match object; span=(0, 7), match='50M.aaa'>, 
<_sre.SRE_Match object; span=(0, 7), match='50M.bbb'>, 
<_sre.SRE_Match object; span=(0, 7), match='50M.ccc'>] 

'50M.aaa' 
'50M.bbb' 

e_list[0].group(0)ながら戻っ'30M.aaa'.findはできません一致オブジェクトなので適用されます。それから、私はどうしたらいいですか?

+0

さらに読書のために:Pythonの3 "[正規表現HOWTO](https://docs.python.org/3/howto/regex.html)" 。 –

+2

バックスラッシュやstring-vs-regexとの奇妙なやりとりを防ぐために、正規表現に[raw strings](https://docs.python.org/3/library/re.html#raw-string-notation)を使用する必要がありますメタキャラクタ: 'r"。* \。(aaa | bbb)$ "' _この正規表現はそれを必要としませんが、習慣を開始すると後で頭痛を軽減します。 –

+0

@ケビン・J・チェイス:ああ、私はすでに正規表現の前に「r」を入れていたと思ったが、それは欠落していた。思い出させていただきありがとうございます。 – IanHacker

答えて

2

私はPythonがあなたの最初の言語ではないと思っています。あなたのコードはJavaのような臭いです。

re.compileは使用しないでください。 re.searchまたはre.findallを使用してください。

とPythonで、あなただけ使用することができます。

result = re.findall('.*\.(aaa|bbb)$', file) 

そして、resultがリストである、あなたはそれを印刷したり、それのすべての項目を取得するためにfor... loopを使用することができます。

はあなたにも使用することができたよう:

result = re.search('.*\.(aaa|bbb)$', file) 

結果はグループです。

次に、result.group(1)を使用して一致するアイテムを取得する必要があります。

SO、あなたのコードは次のようになります

e_list = [] 
for file in os.listdir('.'): 
    e_found = re.search(".*\.(aaa|bbb)$", file) 

    if e_found: 
     e_list.append(e_found.group(1)) 


for item in e_list: 
    if item.find('50M') > 0 
     print(item) 
+0

あなたの答えによって解決されます。実際には、e_list。append(e_found.group(0))は、私が望むもの(ファイル名全体)を私に与えます。それを除いて、私はあなたを完全にコピーし、それは完全に動作します。私の反復を訂正してくれてありがとう。 – IanHacker

2

文字列が'50M'で始まるかどうかを確認するには、str.startswith('50M')を使用してください。これにより、50Mが接尾辞(test.50M)の場合は検出されません。

if e_list[num_e].startswith('50M'): 
    print(e_list[num_e]) 

サフィックスが50Mを見つけるための合法的な場所である場合は、inを使用すると、.find('50M') > 0よりもはるかにきれいです。

if '50M' in e_list[num_e]: 
+1

それは動作しませんでした。キングネームの答えを読んだ後、最後の部分は次のようになっているはずです: if(e_list [num_e] .find( '50M')> 0): print(e_list [num_e]) – IanHacker

+1

@IanHacker正しい答えに更新しました。記述する方法は '.find()'よりはるかに明確で具体的なものになります。 – 2Cubed

+0

はい、今は動作します。ありがとうございました。 – IanHacker

関連する問題