0

私の場合のヘッダー行は次のようなものです。

=== a sample header ===
===== a deeper header =====

そして、深さを変更する必要があります。つまり、深さを減らす(または増やす)必要があります。

== a sample header ==
==== a deeper header ====

Python 正規表現に関する私の小さな知識では、n 個の「=」を (n-1) 個の「=」記号に置き換える方法を理解するには不十分です。

4

5 に答える 5

5

後方参照と 2 つの否定的なルックアラウンドを使用して、対応する 2 つの文字セットを見つけることができます。=

output = re.sub(r'(?<!=)=(=+)(.*?)=\1(?!=)', r'\1\2\1', input)

複数のヘッダーを含む長い文字列がある場合にも機能します (そしてそれらすべてを変更します)。

正規表現は何をしますか?

(?<!=)  # make sure there is no preceding =
=       # match a literal =
(       # start capturing group 1
  =+    # match one or more =
)       # end capturing group 1
(       # start capturing group 2
  .*?   # match zero or more characters, but as few as possible (due to ?)
)       # end capturing group 2
=       # match a =
\1      # match exactly what was matched with group 1 (i.e. the same amount of =)
(?!=)   # make sure there is no trailing =
于 2012-12-18T09:30:44.753 に答える
0

簡単な解決策はどうですか?

lines = ['=== a sample header ===', '===== a deeper header =====']
new_lines = []
for line in lines:
    if line.startswith('==') and line.endswith('=='):
        new_lines.append(line[1:-1])

結果:

['== a sample header ==', '==== a deeper header ====']

または1行で:

new_lines = [line[1:-1] for line in lines if line.startswith('==') and line.endswith('==')]

ここでの論理は、「==」で始まり、「==」で終わる場合、少なくともその数が必要であるため、各辺を削除/トリムすると、各辺に少なくとも「=」が残るということです.

これは、各「行」が「==....」で開始および終了する限り機能し、これらをヘッダーとして使用している場合は、改行を削除する限り機能します。

于 2012-12-18T09:39:56.853 に答える
0

正規表現は必要ありません。私は非常に単純かつ直接的に行きます:

import sys

for line in sys.stdin:
    trimmed = line.strip()
    if len(trimmed) >= 2 and trimmed[0] == '=' and trimmed[-1] == '=':
        print(trimmed[1:-1])
    else:
        print line.rstrip()

stripMarkdown では行末 (場合によっては行頭) に空白を残すことがあるため、イニシャルは便利です。必要に応じて調整してください。

これがライブデモです。

于 2012-12-18T09:36:56.220 に答える
0

'=(=+)'に置き換えるだけで簡単にできると思います\1

そうしない理由はありますか?

于 2012-12-18T09:38:36.060 に答える
0

最初のヘッダーまたは2番目のヘッダーのいずれかで、このように文字列置換を使用できます

s = "=== a sample header ==="
s.replace("= "," ")
s.replace(" ="," ")

このように2番目のヘッダーを処理することもできます

ところで: re モジュールの sub 関数も使用できますが、必須ではありません

于 2012-12-18T09:41:53.300 に答える