2

Ruby に次の関数があり、新しい行ごとにユーザー定義の数のスペースで文字列をインデントするとします。

def reindent(str, numIndent)
    return str.gsub(/(.)^/m) { |m| $1 + ("    " * numIndent) }
end

reを使用してPythonでこの関数をどのように模倣しますか?

以下を試してみましたが、うまくいきませんでした。

def reindent(line, numIndent):
  return re.sub(r'(.)^', r'\1' + '    ' * numIndent, line, flags=re.MULTILINE)
4

2 に答える 2

1

/sMatz は、他のすべての正規表現フレーバーで使用されている修飾子 (SINGLELINEまたは DOTALL) の名前を Ruby の/m( ) 修飾子 (トークンMULTILINEによって改行が「任意の文字」として扱われるかどうかを扱う)に変更することで、すべての人を混乱させることを選択したことを知っておく必要があります)。.

逆に、/morMULTILINE修飾子 (文字列全体の開始/終了だけでなく、行の開始/終了で^and が$一致するかどうかを決定する) を呼び出す他のフレーバーは、Ruby にはまったく存在しません。これらのアンカーは、常に行頭 /行末で一致します。

したがって、コードを Ruby から Python に変換するには、次のことを行う必要があります。

def reindent(line, numIndent):
    return re.sub(r'(.)^', r'\1' + '    ' * numIndent, line, flags=re.DOTALL|re.MULTILINE)

最初の行を除くすべての行をインデントすることが目標である場合 (これが実行されていることです)、正規表現を単純化できます。

def reindent(line, numIndent):
    return re.sub(r'(?<!\A)^', '    ' * numIndent, line, flags=re.MULTILINE)

結果:

>>> s = "The following lines\nare indented,\naren't they?"
>>> print(reindent(s,1))
The following lines
    are indented,
    aren't they?
于 2013-09-18T06:31:45.290 に答える
0

代わりに逆の形式を使用します。

import re
def reindent(line, numIndent):
  return re.sub(r'^(.*)', '    ' * numIndent + r'\1', line, flags=re.MULTILINE)
print(reindent("abcdefghijkl\nmnopqrstu", 1))

出力:

    abcdefghijkl
    mnopqrstu
于 2013-09-18T06:36:23.040 に答える