私は、文字列があります。regexまたはワイルドカードで置き換えますか?
a (45:45) b (65:40) ccc (blah$#)
私はこのように見えるように()
含む()
内にあるすべてのものを、削除したい:
a b ccc
私がしようとするつもりだったがre
と争っていますが、おそらくワイルドカードとreplace()
で行うことができると考えました。私はできるだけre
を避けたいです。
私は、文字列があります。regexまたはワイルドカードで置き換えますか?
a (45:45) b (65:40) ccc (blah$#)
私はこのように見えるように()
含む()
内にあるすべてのものを、削除したい:
a b ccc
私がしようとするつもりだったがre
と争っていますが、おそらくワイルドカードとreplace()
で行うことができると考えました。私はできるだけre
を避けたいです。
ワイルドカードを使用するにはre
が必要です。つまり、手作業で文字列を解析することはできますが、それは時間の無駄です。
import re
s = 'a (45:45) b (65:40) ccc (blah$#)'
print re.sub('\s?\(.*?\)', '', s).strip() # 'a b ccc'
半分くらいはまともですが、 's'が括弧内のグループで始まったときに失敗します。 – hop
@hop最初のマッチングを削除し、文字列をグループで開始できるようにしました。アウトプットはスペースで始まるかもしれませんが、私はすぐにそれを解消する時間がありません。 –
あなたは正しい:文字列の解析時に、特にネストされた構造が潜んでいる可能性がある場合に、正規表現が常に頭に浮かぶとは限りません。
括弧をカウントし、それに応じて行動することは比較的簡単です:想像力のビットで
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)
ネストされた構造が含まれている場合、これは素晴らしい解決策です*。しかし、これは、1行の正規表現で十分である状況では、これが過剰なことに言及する価値があるかもしれません。 –
まあ、ここでの他の答えは、正規表現の解決に大きな自信を与えません。また、OPはそれを求めた。 – hop
何をすべきかあなたは空白としたいですか? – hop