知財のあれこれをPythonで何とかする

### 段落番号を何とかする
明細書の段落番号（【0001】、【0002】・・・）をリナンバーするプログラムです。
なお半角→全角変換のためライブラリ（mojimoji）を使っていますので、プログラム実行前にインストール（pip install mojimoji）が必要です。

```python:Program1.py
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形式で保存します。
<details><summary>サンプルデータ</summary>

```
【発明の詳細な説明】
【技術分野】
【０００１】
  本開示は、情報処理技術に関する。
【背景技術】
【０００２】
　従来は、○○であった。
【０００３】
　特許文献１には、△が開示されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】 特開２０２４－１２３４５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
  しかしながら、考えられる。
【００１０】
  そこで本開示は、技術を提供することを目的とする。
【課題を解決するための手段】
【００１５】
  本開示の一態様に係る情報処理装置は、特徴とする。
【発明の効果】
【００２０】
  本開示によれば、改善することができる。
【図面の簡単な説明】
【００１０】
【図１】システムの構成を示す図。
【図２】操作ＵＩの外観を示す図。
【図３】制御系の構成を示すブロック図。
【図４】制御処理を示すフローチャート。
【図５】動作例１を説明する図。
【図６】動作例２を説明する図。
【図７】動作例３を説明する図。
【発明を実施するための形態】
【００１１】
  以下、本開示に係る実施形態について、図面を参照して説明する。
【００１２】
  ＜＜実施形態１＞＞
  本実施形態では、○○ができる。
【００１２】
  ＜システムの構成＞
  図１は、本実施形態における情報処理システムの構成を示す図である。
```
</details>
program1を実行すると以下の様に段落番号がリナンバーされた明細書を作成しrenum.txtに書き込み保存します。

<details><summary>リナンバー済みデータ</summary>

```

【発明の詳細な説明】
【技術分野】
【０００１】
　　本開示は、情報処理技術に関する。
【背景技術】
【０００２】
　従来は、○○であった。
【０００３】
　特許文献１には、△が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】　特開２０２４－１２３４５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
　　しかしながら、考えられる。
【０００６】
　　そこで本開示は、技術を提供することを目的とする。
【課題を解決するための手段】
【０００７】
　　本開示の一態様に係る情報処理装置は、特徴とする。
【発明の効果】
【０００８】
　　本開示によれば、改善することができる。
【図面の簡単な説明】
【０００９】
【図１】システムの構成を示す図。
【図２】操作ＵＩの外観を示す図。
【図３】制御系の構成を示すブロック図。
【図４】制御処理を示すフローチャート。
【図５】動作例１を説明する図。
【図６】動作例２を説明する図。
【図７】動作例３を説明する図。
【発明を実施するための形態】
【００１０】
　　以下、本開示に係る実施形態について、図面を参照して説明する。
【００１１】
　　＜＜実施形態１＞＞
　　本実施形態では、○○ができる。
【００１２】
　　＜システムの構成＞
　　図１は、本実施形態における情報処理システムの構成を示す図である。
```
</details>

### プログラムのポイント
 - (part1)
meisai.txtのデータを【で分割してリストmeisaiに代入します。この時に文頭の【が失われるため以降の処理は【が無い状態を前提に処理しています。

 - (part2)
以下の処理ではpattern（正規表現で”[0-9]{4}】”）と一致した場合に、段落番号が文頭にあると判定してre.sub(pattern, "",m)でpatternの部分を削除（""に置換え）し、文頭にf'【{i:04d}】を追加します。iはカウントアップする値、04dは4桁（段落番号の標準的な桁数）を示しますので4桁のカウントアップする値が【】内に書き込まれますので、【0001】、【0002】・・の連続した段落番号が生成されます。

```python:
    if re.search(pattern, m):
        matches = re.sub(pattern, "",m)
        formatted_numbers = f'【{i:04d}】'#｛i:0nd}のnに桁数を設定
        text = formatted_numbers+matches
        i+=1
```
文頭が段落番号でない場合、文頭のスペースを削除して再度【を追加します。
```python:
    else:
        text = "【"+m.lstrip() #先頭のスペースを削除して【を付ける
```
renum.txt書き込み前に文末改行を削除し半角数値を全角に変換します。
```python:
    text = text.rstrip("\n")#文末改行を削除
    text = mojimoji.han_to_zen(text, digit=True)#半角→全角
```
段落番号の開始番号を1以外の値にしたい場合は以下のｉの設定値を変更してください。
```python:
i=1 #開始番号
```

### 注意点
数値の半角→全角処理を入れているので、段落番号以外の数値も全角になります。意図して半角にしたい場合は注意ください。

### 最後に
今回のようなちょっとした文字列処理をする場合に、正規表現とかループ処理といったpythonの文字列処理機能のメリットが発揮できると思います。今回もCopilotの力を借りて作成しましたが、AI機能はpythonの開発効率を非常に高めてくれると実感しています。
今回の記事がお役に立てれば幸いです。