2017-04-25 6 views
0

私は、文字列があります。regexまたはワイルドカードで置き換えますか?

a (45:45) b (65:40) ccc (blah$#)

私はこのように見えるように()含む()内にあるすべてのものを、削除したい:

a b ccc

私がしようとするつもりだったがreと争っていますが、おそらくワイルドカードとreplace()で行うことができると考えました。私はできるだけreを避けたいです。

+0

何をすべきかあなたは空白としたいですか? – hop

答えて

1

ワイルドカードを使用するにはreが必要です。つまり、手作業で文字列を解析することはできますが、それは時間の無駄です。

import re 

s = 'a (45:45) b (65:40) ccc (blah$#)' 
print re.sub('\s?\(.*?\)', '', s).strip() # 'a b ccc' 
+0

半分くらいはまともですが、 's'が括弧内のグループで始まったときに失敗します。 – hop

+0

@hop最初のマッチングを削除し、文字列をグループで開始できるようにしました。アウトプットはスペースで始まるかもしれませんが、私はすぐにそれを解消する時間がありません。 –

1

あなたは正しい:文字列の解析時に、特にネストされた構造が潜んでいる可能性がある場合に、正規表現が常に頭に浮かぶとは限りません。

括弧をカウントし、それに応じて行動することは比較的簡単です:想像力のビットで

def filter_parens(sentence): 
    result, level = [], 0 
    for c in sentence: 
     if c == '(': 
      level += 1 
     elif c == ')': 
      level = max(0, level-1) 
     elif level == 0: 
      result.append(c) 
    return ''.join(result) 

あなたにも空白のブラケットや実行をelminateするためにそれを拡張することができます

def filter_parens(sentence): 
    result, level, whitespace = [], 0, False 
    for c in sentence: 
     if c == '(': 
      level += 1 
      continue 

     if c == ')': 
      level = max(0, level-1) 
      continue 

     if level: 
      continue 

     if c.isspace() and not whitespace: 
      whitespace = True 
      result.append(c) 
      continue 

     if c.isspace(): 
      continue 

     whitespace = False 
     result.append(c) 

    return ''.join(result) 
+0

ネストされた構造が含まれている場合、これは素晴らしい解決策です*。しかし、これは、1行の正規表現で十分である状況では、これが過剰なことに言及する価値があるかもしれません。 –

+0

まあ、ここでの他の答えは、正規表現の解決に大きな自信を与えません。また、OPはそれを求めた。 – hop

関連する問題