私の場合のヘッダー行は次のようなものです。
=== a sample header ===
===== a deeper header =====
そして、深さを変更する必要があります。つまり、深さを減らす(または増やす)必要があります。
== a sample header ==
==== a deeper header ====
Python 正規表現に関する私の小さな知識では、n 個の「=」を (n-1) 個の「=」記号に置き換える方法を理解するには不十分です。
後方参照と 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 =
簡単な解決策はどうですか?
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('==')]
ここでの論理は、「==」で始まり、「==」で終わる場合、少なくともその数が必要であるため、各辺を削除/トリムすると、各辺に少なくとも「=」が残るということです.
これは、各「行」が「==....」で開始および終了する限り機能し、これらをヘッダーとして使用している場合は、改行を削除する限り機能します。
正規表現は必要ありません。私は非常に単純かつ直接的に行きます:
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()
strip
Markdown では行末 (場合によっては行頭) に空白を残すことがあるため、イニシャルは便利です。必要に応じて調整してください。
これがライブデモです。
'=(=+)'
に置き換えるだけで簡単にできると思います\1
。
そうしない理由はありますか?
最初のヘッダーまたは2番目のヘッダーのいずれかで、このように文字列置換を使用できます
s = "=== a sample header ==="
s.replace("= "," ")
s.replace(" ="," ")
このように2番目のヘッダーを処理することもできます
ところで: re モジュールの sub 関数も使用できますが、必須ではありません