2016-07-27 7 views
1

文字列が別のものの一部であることを確認するには、set/frozensetsクラスとissubsetメソッドを使用するか、基本的には行の先頭から複数の先読みアサーションになる正規表現を使用できます。私はregexオプションを使いたい。すべての文字列が文字列内に存在することを確認する(Python 2+)

以下のようにしなくても(文字列の反復処理と手動で先読みアサーションを作成することで、私が扱う大きなデータを与えてくれる大きな文字列を作ることができます)ストレートフォワード的その他の項目は、私は、単一の文字で動作していないということです必要な先読みアサーションの数が非常に大きな得ることができるように

import re 

userInput = raw_input() 
listOfChars = 'asdfgei' 

myRegexString = '' 
for i in listOfChars: 
    myRegexString = myRegexString+'(?=.*'+i+')' 
    myRegexCompiled = re.compile(myRegexString) 
if myRegexCompiled.(userInput): 
    print True 
+0

そして、何 'set'操作を使用して間違っていますか? – TigerhawkT3

+0

私の知る限り(私が間違っていれば私を修正してください)セットは遅く、セットは1文字でしか動作せず、文字シーケンスの検証には働きません – engineer14

+0

サブセット内のすべての文字が存在することを確認するあなたのタイトル文字列の中の "文字列"とは、この文字列とは実質的に異なって見えます。あなたは実際に何をしたいですか? – TigerhawkT3

答えて

3

あなたは、コレクション内のすべての文字列が与えられた文字列中に存在していることを確認ジェネレータ式でall()を使用する場合:

answer = all(word in string for word in bag) 
+0

を更新しました。まさに私が探していたものです。スケーリングしたときの正規表現解とどのように比較すればよいでしょうか? – engineer14

+0

この答えは私のものより優れていますが、分かりやすくするため、あるいは 'word'、' string'、 'bag'の例を提供するために、おそらく異なる変数名を使用しています。 –

+0

@ engineer14これもO(M * N)になります。ここで、Mはテスト対象セット内の要素の数であり、Nはテストする要素の数です。あなたは、正規表現のオーバーヘッド(とあなたの正規表現を書く方法に応じて悪いオーダーの可能性があります)を避けている –

0

それでは、あなたは二つの文字列としましょう - ?。。userInputを、これは非常に大きいかもしれないし、listOfCharsは比較的小さく、listOfCharsの各要素がに存在するかどうかを確認したい、userInputsetに変換することなく

このために正規表現を使用する必要はありません - ちょうど、このようにそれを行うには高速になります:

userInput = raw_input() 
listOfChars = 'asdfgei' 

def containsSubset(large, small): 
    for element in set(small): # Convert to a set to remove dupes 
     if not large.contains(element): 
      return False 
    return True 

return containsSubset(userInput, listOfChars) 

これは、MはuserInputの大きさであるO(M * N)、となりますNはlistOfCharsのサイズです。

関連する問題