段落番号を何とかする
明細書の段落番号(【0001】、【0002】・・・)をリナンバーするプログラムです。
なお半角→全角変換のためライブラリ(mojimoji)を使っていますので、プログラム実行前にインストール(pip install mojimoji)が必要です。
import re
import mojimoji
import unicodedata
#part1 前処理
meisai = []
ms_base = []
f = open('meisai.txt', 'r')#ANSIで保存すること
ms_base = f.read()
f.close()
ms_base=unicodedata.normalize("NFKC", ms_base)#請求項数の数値を半角にする
meisai = re.split("【",ms_base)#段落ごとに分割する
meisai.pop(0)
with open('renum.txt', 'w') as f:#書込み先ファイルをクリアする
print("", file=f)
#part2 リナンバー
pattern = "[0-9]{4}】"#{n}に桁数を設定
i=1 #開始番号
for m in meisai:
if re.search(pattern, m):
matches = re.sub(pattern, "",m)
formatted_numbers = f'【{i:04d}】'#{i:0nd}のnに桁数を設定
text = formatted_numbers+matches
i+=1
else:
text = "【"+m.lstrip() #先頭のスペースを削除して【を付ける
text = text.rstrip("\n")#文末改行を削除
text = mojimoji.han_to_zen(text, digit=True)#半角→全角
with open('renum.txt', 'a') as f:
print(text, file=f)
以下のサンプルをファイル名「meisai.txt」としてANSI形式で保存します。
サンプルデータ
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、情報処理技術に関する。
【背景技術】
【0002】
従来は、○○であった。
【0003】
特許文献1には、△が開示されている。
【先行技術文献】
【特許文献】
【0006】
【特許文献1】 特開2024-12345号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
しかしながら、考えられる。
【0010】
そこで本開示は、技術を提供することを目的とする。
【課題を解決するための手段】
【0015】
本開示の一態様に係る情報処理装置は、特徴とする。
【発明の効果】
【0020】
本開示によれば、改善することができる。
【図面の簡単な説明】
【0010】
【図1】システムの構成を示す図。
【図2】操作UIの外観を示す図。
【図3】制御系の構成を示すブロック図。
【図4】制御処理を示すフローチャート。
【図5】動作例1を説明する図。
【図6】動作例2を説明する図。
【図7】動作例3を説明する図。
【発明を実施するための形態】
【0011】
以下、本開示に係る実施形態について、図面を参照して説明する。
【0012】
<<実施形態1>>
本実施形態では、○○ができる。
【0012】
<システムの構成>
図1は、本実施形態における情報処理システムの構成を示す図である。
リナンバー済みデータ
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、情報処理技術に関する。
【背景技術】
【0002】
従来は、○○であった。
【0003】
特許文献1には、△が開示されている。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】 特開2024-12345号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、考えられる。
【0006】
そこで本開示は、技術を提供することを目的とする。
【課題を解決するための手段】
【0007】
本開示の一態様に係る情報処理装置は、特徴とする。
【発明の効果】
【0008】
本開示によれば、改善することができる。
【図面の簡単な説明】
【0009】
【図1】システムの構成を示す図。
【図2】操作UIの外観を示す図。
【図3】制御系の構成を示すブロック図。
【図4】制御処理を示すフローチャート。
【図5】動作例1を説明する図。
【図6】動作例2を説明する図。
【図7】動作例3を説明する図。
【発明を実施するための形態】
【0010】
以下、本開示に係る実施形態について、図面を参照して説明する。
【0011】
<<実施形態1>>
本実施形態では、○○ができる。
【0012】
<システムの構成>
図1は、本実施形態における情報処理システムの構成を示す図である。
プログラムのポイント
-
(part1)
meisai.txtのデータを【で分割してリストmeisaiに代入します。この時に文頭の【が失われるため以降の処理は【が無い状態を前提に処理しています。 -
(part2)
以下の処理ではpattern(正規表現で”[0-9]{4}】”)と一致した場合に、段落番号が文頭にあると判定してre.sub(pattern, "",m)でpatternの部分を削除(""に置換え)し、文頭にf'【{i:04d}】を追加します。iはカウントアップする値、04dは4桁(段落番号の標準的な桁数)を示しますので4桁のカウントアップする値が【】内に書き込まれますので、【0001】、【0002】・・の連続した段落番号が生成されます。
if re.search(pattern, m):
matches = re.sub(pattern, "",m)
formatted_numbers = f'【{i:04d}】'#{i:0nd}のnに桁数を設定
text = formatted_numbers+matches
i+=1
文頭が段落番号でない場合、文頭のスペースを削除して再度【を追加します。
else:
text = "【"+m.lstrip() #先頭のスペースを削除して【を付ける
renum.txt書き込み前に文末改行を削除し半角数値を全角に変換します。
text = text.rstrip("\n")#文末改行を削除
text = mojimoji.han_to_zen(text, digit=True)#半角→全角
段落番号の開始番号を1以外の値にしたい場合は以下のiの設定値を変更してください。
i=1 #開始番号
注意点
数値の半角→全角処理を入れているので、段落番号以外の数値も全角になります。意図して半角にしたい場合は注意ください。
最後に
今回のようなちょっとした文字列処理をする場合に、正規表現とかループ処理といったpythonの文字列処理機能のメリットが発揮できると思います。今回もCopilotの力を借りて作成しましたが、AI機能はpythonの開発効率を非常に高めてくれると実感しています。
今回の記事がお役に立てれば幸いです。