2

マークされたすべての部分文字列が含まれている文字列があり、<> にする必要があります (括弧は入れ子になりません)。例えば、

"hello <wolfrevokcats>, how <t uoy era>oday?"

なるべき

 "hello stackoverflow, how are you today?"

私の現在のアイデアは、文字列をループして、インデックスのペア where<>are を見つけることです。次に、文字列をスライスして、マーカーの間にあるすべてのものを逆にして、スライスを再び組み合わせます. これは正しいアプローチですか?明らかな/より良い解決策はありますか?

4

5 に答える 5

8

正規表現を使えば簡単です。re.sub一致オブジェクトが渡される引数として関数を取ります。

>>> import re
>>> s = 'hello <wolfrevokcats>, how <t uoy era>oday?'
>>> re.sub('<(.*?)>', lambda m: m.group(1)[::-1], s)
'hello stackoverflow, how are you today?'

正規表現の説明:

<(.*?)>正規表現エンジンが最初のシンボルの出現で停止することを保証するため<に、遅延量指定子が使用されます。>>*?

lambda m: m.group(1)[::-1]に渡される関数re.subは、一致オブジェクトを取得し、グループ 1 を抽出して、文字列を反転します。最後にre.sub、この戻り値を挿入します。

于 2016-03-18T20:05:36.910 に答える
4

または、次の置換関数re.sub()を使用します。

>>> import re 
s = 'hello <wolfrevokcats>, how <t uoy era>oday?'
>>> re.sub(r"<(.*?)>", lambda match: match.group(1)[::-1], s)
'hello stackoverflow, how are you today?'

whereは、貪欲でない.*?方法で何度でも任意の文字に一致します。それを括弧で囲むと、それをグループに取り込んで、置換関数 - で参照するのに役立ちます。スライス表記は文字列を反転しますmatch.group(1)[::-1]

于 2016-03-18T20:05:20.320 に答える
3

これは授業の課題であり、正規表現の使用は許可されていないと仮定します。そこで、それを使わない解決策を提供します。

content = "hello <wolfrevokcats>, how <t uoy era>oday?"

insert_pos = -1
result = []
placeholder_count = 0

for pos, ch in enumerate(content):
    if ch == '<':
        insert_pos = pos
    elif ch == '>':
        insert_pos = -1
        placeholder_count += 1
    elif insert_pos >= 0:
        result.insert(insert_pos - (placeholder_count * 2), ch)
    else:
        result.append(ch)

print("".join(result))

コードの要点は、一度に 1 文字ずつ文字列を 1 回だけパスすることです。括弧の外にある場合は、結果文字列の末尾に文字を追加するだけです。大括弧内では、左大括弧の位置に文字を挿入します (つまり、文字を前に追加します)。

于 2016-03-18T20:14:41.743 に答える