-2

の形式になる可能性のあるあらゆる種類のファイル名で:

  • String1_Todelete_restofstring.txt
  • String2_Alsotoremove_restofstring.txt
  • String3_2013_restofstring.txt
  • String4_2011_restofstring.txt
  • String5_restofstring_tosuppress.txt

re.subを含む関数を定義して、リスト (または辞書) に定義されているすべてのキーワードを削除したいと思います。

「消して」、2013年、2011年、「ももも」、「抑圧する」

そうすれば、上記の例 (異なる日付を含めることができます) は次のようになります。

  • String1_restofstring.txt
  • String2_restofstring.txt
  • String3_restofstring.txt
  • String4_restofstring.txt
  • String5_restofstring.txt

お知らせ下さい

___編集 _

役立つ回答をありがとう。Cobabunga の実装は、関数に実装するのにコンパクトであることがわかりました。コメント内の質問に関しては、あらゆる種類の解決策を可能にするために質問をできるだけ一般的なものにすることを意図していたので、そこに保留する必要はありません。正規表現でも実装できると思う日付についても考えました。

4

4 に答える 4

2

次のように、削除するすべての単語を含む正規表現を作成できます。

import re

to_remove = ["Todelete", "2013", "2011", "Alsotoremove", "tosuppress"]
pattern = "|".join("_?" + re.escape(x) for x in to_remove)

names = ["String1_Todelete_restofstring.txt",
         "String2_Alsotoremove_restofstring.txt",
         "String3_2013_restofstring.txt",
         "String4_2011_restofstring.txt",
         "String5_restofstring_tosuppress.txt"]

names_replaced = [re.sub(pattern, "", x) for x in names]
print names_replaced

Todelete最初の例でのみ置換すると、String1__restofstring.txt代わりにString1_restofstring.txt.

特定のre.escape例では必要ありませんが、単語に正規表現で特別な意味を持つ文字が含まれている場合、それがないと予期しない結果が得られます。

于 2013-04-26T01:27:51.783 に答える
1

これはおそらく、キーワードの数だけ各文字列をスキャンするよりも効率的です。

import re

strings = """String1_Todelete_restofstring.txt
String2_Alsotoremove_restofstring.txt
String3_2013_restofstring.txt
String4_2011_restofstring.txt
String5_restofstring_tosuppress.txt""".split()

keywords = set(("Todelete", "2013","2011", "Alsotoremove","tosuppress"))

for s in strings:
    print re.sub("_[^_.]+", lambda m: "" if m.group(0)[1:] in keywords else m.group(0), s)
于 2013-04-25T18:46:58.173 に答える
1

これは機能します:

import re

st='''\
String1_Todelete_restofstring.txt
String2_Alsotoremove_restofstring.txt
String3_2013_restofstring.txt
String4_2011_restofstring.txt
String5_restofstring_tosuppress.txt'''

deletions=["Todelete", '2013','2011', "Alsotoremove","tosuppress"]

for line in st.splitlines():
    for deletion in deletions:
        if re.search('_'+deletion,line):
            line=re.sub('_'+deletion,'',line)
    print line  

編集

コメントで指摘されているように、re.searchは冗長です。

また、特定のケースでは、 str.replace のがはるかに高速です。

import re
import timeit 

st='''\
String1_Todelete_restofstring.txt
String2_Alsotoremove_restofstring.txt
String3_2013_restofstring.txt
String4_2011_restofstring.txt
String5_restofstring_tosuppress.txt'''

deletions=["Todelete", '2013','2011', "Alsotoremove","tosuppress"]


def rep():
    for line in st.splitlines():
        for deletion in deletions:
            line=line.replace('_'+deletion,'')


def reg():
    for line in st.splitlines():
        for deletion in deletions:
            line=re.sub('_'+deletion,'',line)            


print timeit.timeit('reg()', setup='from __main__ import reg', number=10000)     
print timeit.timeit('rep()', setup='from __main__ import rep', number=10000) 

私のマシンでstr.replace()は、約5倍高速です。

于 2013-04-25T18:16:43.277 に答える
0

アイデアを提供するために (私は携帯電話を使用しているため、長くはありません);

/(.*?)_.*?_(.*?)\.(\w{2,})/

group(1) + '_' + group(2) + '.' + group(3)
于 2013-04-25T18:09:39.937 に答える