以下のような、核種を表す表記を、LaTeXで使えるような表記に置換したい。
He4 → \Nuc{He}{4}{} He5L → \Nuc{He}{4}{\Lambda}
シンプルなコードだと以下の通り。
グループ化という機能を使って、正規表現側で ()
で囲むと、囲んだところが \1
\2
と番号が振られるので、それを使って置き換えると良い。
使っている正規表現についてのみ説明しておくと、
[A-Z]
で大文字のアルファベット、 [a-z]
で小文字のアルファベット ?
はその前の文字があるかないか、 \d
は数字 {1,3}
はその前の文字を1回~3回繰り返す。
import re print(re.sub(r'([A-Z][a-z]?)(\d{1,3})', r"\\Nuc{\1}{\2}{}", "He4")) # \Nuc{He}{4}{} print(re.sub(r'([A-Z][a-z]?)(\d{1,3})L', r"\\Nuc{\1}{\2}{\\Lambda}", "He4L")) # \Nuc{He}{4}{\Lambda}
ファイル内の全ての核種を表す表記を置き換えてみる。置換が起きなくなるまでループしている。
import re with open("text.txt",encoding="utf-8") as f: lines = f.readlines() for i in range(len(lines)): while True: buf = lines[i] lines[i] = re.sub(r'([A-Z][a-z]?)(\d{1,3})L', r"\\Nuc{\1}{\2}{\\Lambda}", lines[i]) lines[i] = re.sub(r'([A-Z][a-z]?)(\d{1,3})', r"\\Nuc{\1}{\2}{}", lines[i]) if buf == lines[i]: break with open("text_sub.txt","w",encoding="utf-8") as f: f.writelines(lines)
ちなみにtex側はこうしてる。
\newcommand{\Nuc}[3]{$^{#2}_{#3}{\rm #1}$}