1

次の自明のコードのpythonicで効率的な代替品を探しています:

term = "< << >" # turn this into "( < )"
term.replace("<<", "#~").replace(">>", "~#").replace(">", ")").replace("<", "(").replace("#~", "<").replace("~#", ">")

何か案は?

4

4 に答える 4

3

正規表現を使用します。

import re
d = {'<': '(', '>': ')'}
replaceFunc = lambda m: m.group('a') or d[m.group('b')]
pattern = r"((?P<a><|>)(?P=a)|(?P<b><|>))"
term = "< << >"

replaced = re.sub(pattern, replaceFunc, term) #returns "( < )"

Niklas B. の推奨に従って編集します。

上記の正規表現は、マッチングと同等です。

("<<" OR ">>") OR ("<" OR ">")

(?P<a><|>) #tells the re to match either "<" or ">", place the result in group 'a'
(?P=a) #tells the re to match one more of whatever was matched in the group 'a'
(?P<b><|>) #tells the re to match a sing "<" or ">" and place it in group 'b'

実際、ラムダ関数replaceFuncは単にこの一致シーケンスを繰り返しますが、関連する置換文字を返します。

これreは「最大グループが最初」に一致するため、"<<< >"に変換され"<( )"ます。

于 2012-04-27T19:29:43.453 に答える
2

これは私の最初の答えよりも短い方法です。二重化された文字シーケンスの入力を分割してそれらを削除し、それらのセグメントを元の単一文字で再び結合します。以前と同様に、辞書を使用して、行うべき置換を指定します。

def convert(s, replacements):
    for before, after in replacements.items():
        s = before.join([segment.replace(before, after) for segment in s.split(before + before)])
    return s

>>> convert('< << >', {'<': '(', '>': ')'})
'( < )'
于 2012-04-27T21:20:00.323 に答える
1

すべての置換用語をリストに入れ、それを繰り返して置換します。

CHARS = [
  ('<<', '#~'),
  ('>>', '~#'),
  ...
]

for replace in CHARS:
   term = term.replace(*replace)

それが最もpythonicであるかどうかはわかりませんが、かなり明確に見えます。文字のリストを受け取る forloop を因数分解することもできます。

于 2012-04-27T19:16:40.850 に答える
0

これがどれほどPythonicなのかはわかりませんが、機能し、非常に柔軟です。

def convert(s, replacements):
    pending_char = None
    result = []
    for c in s:
        if c in replacements:
            if c == pending_char:
                result.append(c)
                pending_char = None
            else:
                pending_char = c
        else:
            if pending_char:
                result.append(replacements[pending_char])
                pending_char = None
            result.append(c)
    if pending_char:
        result.append(replacements[pending_char])
    return ''.join(result)

>>> convert('< << >', {'<': '(', '>': ')'})
'( < )'
于 2012-04-27T19:57:41.750 に答える