2016-08-01 9 views
1

私は可能な区切り文字のリストを持っています。私は数千の文字列を処理しており、区切り文字の1つが見つかった後はすべてを取り除く必要があります。注:文字列に2つ以上の区切り文字がある場合はありません。正規表現なしの可能な区切り文字のリストの後にすべてを取り除く

例:

patterns = ['abc', 'def'] 
example_string = 'hello world abc 123' 

example_stringこの場合に入力された場合、出力はhello world abcであるべきです。

私は現在、解決策としてregexを使用していますが、これは正規表現を使用しないアプローチを使用したいと考えています。

regex = r'(.*)(' + '|'.join(patterns) + r')(.*)' 
example_string= re.sub(regex, r'\1\2', example_string).lstrip() 

私はパターンから区切り文字のいずれかが文字列であるかどうかを確認するために検索の線に沿って何かを考え、それまでの区切り文字の長さの位置から文字列のインデックスを作成しています:ここに私の現在の実装ですストリングの終わり。

これを実装するのが適切かどうか、それがうまくいくかどうかはわかりません。

+0

「パターン」にはどれくらいの文字列がありますか?彼らはすべて同じ長さですか? –

+0

パターンには28個の文字列がありますが、時間とともに変化する可能性があります。そして、いいえ、弦の長さは変わります。 – Harrison

+0

その場合、正規表現ベースのアプローチはおそらく正規表現以外のソリューションより優れているでしょう。 –

答えて

3

find機能を使用できます。

patterns = ['abc', 'def'] 
    example_string = 'hello world abc 123' 
    for pattern in patterns: 
     location = example_string.find(pattern) 
     if location >= 0: 
      example_string = example_string[:location + len(pattern)] 
      print example_string 
      break 
2

を使用して:ここで各パターンは、(例のように、パターンの長さを追加することによって、またはパターンの終了位置)をチェックし、見つかった場合、文字列は、パターンの開始位置でスライスされますMethodeのに

のstring.Find見つける(S、サブ[開始[エンド]])

戻りサブサブサブが全体の中に含まれるように見出されるs内の最小インデックス[始まりと終わり]。失敗したら-1を返します。開始と終了のデフォルトと負の値の解釈は、スライスの場合と同じです。 [:終了]あなたはリスト内包とスライスを乱用することができます

3

とあなたの結果は、Sである

delimiters = ['a', 'b'] 
s = 'nvcakl' 
s = [s[:s.index(i) + 1] for i in delimiters if i in s] 
print(s) 
>> ['nvca'] 

これは、複数の区切り文字が発見された場合でも動作しますが、出力リストの各インデックス見つかった区切り文字に対応します。例:

delimiters = ['a', 'b'] 
s = 'nvcaklbh' 
s = [s[:s.index(i) + 1] for i in delimiters if i in s] 
print(s) 
>> ['nvca', 'nvcaklb'] 
+0

デリミタが1つ以上見つかった場合、デリミタが最初に出現したときにその文字列を取り除いてもらいたいです。これはまだ理想的な解決策でしょうか? – Harrison

+0

OPの区切り文字はさまざまな長さの文字列です。したがって、 '+ 1'は一般的には機能しません。また、このアルゴリズムは、一致が見つかった後でも、すべての区切り文字をテストします。 –

+0

@ PM2Ringこれはおおまかな考えです。 '+ 1'を' + len(i) 'に変更することは問題ありません。 – DeepSpace

関連する問題