2016-05-03 13 views
3

によって後方の文字列私はこのようになります文字列を持っている:私が欲しいものスライスインデックス

((id = id_2) AND (condition1 = condition2)) 

が最初で終わる文字列を取得することです「)」と後方まで関連する「(」その後。 これまでのところ、私のコードは次のようなものです:

original_string = '((id = id_2) AND (condition1 = condition2))' 
while ')' in original_string: 
    needed_string = original_string[original_string.index(')'):original_string.index('('):-1][::-1] 
    original_string.replace(needed_string, 'False') 
これまでのところ、私のコードは次のようなものです。

これは機能し、最初の繰り返しの後に私が望むものを得る:

needed_string = '(id = id_2)' 
original_string = '(False AND (condition1 = condition2))' 

しかし、次の反復では、私が取得:

needed_string = 'False AND (condition1 = condition2)' 

私は2回目の反復のために欲しいです:

needed_string = '(condition1 = condition2)' 

私は置き換える使用した後、original_stringは次のように見えるように:

original_string = '(False AND False)' 

このようにして、3回目の反復中:

needed_string = '(False and False)' 

と、

original_string = 'False' 

を交換した後、私のpythonに新しいですので、これはOKである場合はこれを行うことには良い方法がありますかどうかはわからないんだけど、それが行われなければなりません簡単な方法で(サードパーティのライブラリを使用せずに)トークン化

+0

を使用しようとすることができ、この問題を解決するために

、https://sexpdata.readthedocs.io/en/latest/ – enedil

+0

サードパーティのライブラリを使用せずに完了しなければならないことを忘れてしまった –

+1

あなたのコードがどのように動作するのかを知るために、それぞれの反復に対して望ましい出力を提供するために質問を編集してください。 – manglano

答えて

3

regular expressionsを使用して、必要な値をすべて検索して置き換えることができます。

import re 
def get_groups(expr, replace): 
    pattern = re.compile(r'\([^()]*\)') 
    while True: 
     m = pattern.search(expr) 
     if m is None: 
      break 
     expr = expr[:m.start()] + replace + expr[m.end():] 
     yield (m.group(), expr) 

、そのように、このメソッドを使用します。

>>> expr = '((id = id_2) AND (condition1 = condition2))' 
>>> for needed_string, original_string in get_groups(expr, 'False'): 
     print('needed string =', repr(needed_string)) 
     print('original string =', repr(original_string)) 
     print() 

needed string = '(id = id_2)' 
original string = '(False AND (condition1 = condition2))' 

needed string = '(condition1 = condition2)' 
original string = '(False AND False)' 

needed string = '(False AND False)' 
original string = 'False' 
3

あなたのアプローチの問題は、あなたが最初左括弧ではないあなたが前に見つかった右括弧に対応するものを見つけることです。あなたはKupiakos suggestedとして正規表現を使用することができますかあなたが怠け者ならstr.rfind方法

def replace_first_expression(string, replacement): 
     close_parenthesis_pos = string.find(')') 
     if close_parenthesis_pos == -1: 
      return string 
     open_parenthesis_pos = string.rfind('(', 0, close_parenthesis_pos) 
     if open_parenthesis_pos == -1: 
      return string 
     return string[:open_parenthesis_pos] + replacement + string[close_parenthesis_pos + 1:] 
関連する問題