久しぶりの投稿になります。
一時期、年齢的な限界を感じプログラミングから離れることも考えていましたが、生成AIの登場により再び活動に復帰しました。
特筆すべきは、その生産性の向上です。
先日、生成AIを全面的に活用することで、技術書『ようこそ!生成AIと始めるPython入門』を実質1日で完成させることができました。
▼完成した技術書(Zenn)
https://zenn.dev/niji2/books/dc733aba687c92
この経験から、現在のAIは単なるコードスニペット生成ツールではなく、開発のパートナーとして機能すると確信し、現在はWebアプリケーションの新規プロジェクトにも挑戦しています。同時にFlutterによるスマートフォンアプリも開発できないか試験中で、多分開発できるのでないかと思っています。
この技術書を作成する中で、AIとの協業の有効性を示す興味深い事例がありました。
Markdownのレンダリングに関する不具合についてAIに質問したところ、
「
**「...」**
という記法は、パーサーによっては正しく解釈されないため、「**...**」
の形式に修正することが推奨されます」
との的確な回答を得ました。
そこで思考実験として、
「この置換処理を行うPythonスクリプトを提案してください。教育的な目的も兼ねて」
と追加で依頼したところ、以下のような回答がありました。
素晴らしいアイデアですね!
まさに、学んだことをすぐに実践で活かす絶好の機会です。ご指摘の問題を解決するPythonプログラムを作成し、そのコードが何をしているのかを詳しく解説します。
問題
Markdownテキスト内の **「何かのテキスト」**
という形式の太字を、より多くの環境で正しく表示される 「**何かのテキスト**」
という形式に一括で置換したい。
解決策のプログラム
この問題を解決するには、Pythonの正規表現という機能を使うのが最適です。正規表現は、文字列の中から特定のパターンを見つけ出して操作するための非常に強力なツールです。
以下に、そのプログラム全体を示します。
import re
def fix_markdown_bold(text: str) -> str:
"""
Markdownテキスト内の "**「テキスト」**" という形式の太字を
"「**テキスト**」" という形式に修正します。
Args:
text (str): 修正したいMarkdownテキスト。
Returns:
str: 修正後のMarkdownテキスト。
"""
# 1. 正規表現のパターンを定義
# - \*\* : 2つのアスタリスク「**」にマッチします。
# - 「 : 始めの鉤括弧「「」にマッチします。
# - (.*?) : カッコで囲まれた部分は「キャプチャグループ」になります。
# 「.」は任意の1文字、「*」は0回以上の繰り返し、「?」は最短マッチ(非貪欲)を意味し、
# 「「」と「」」の間にある全ての文字列を抜き出します。
# - 」 : 終わりの鉤括弧「」」にマッチします。
# - \*\* : 終わりの2つのアスタリスク「**」にマッチします。
pattern = r'\*\*「(.*?)」\*\*'
# 2. 置換後の文字列の形式を定義
# - 「**\1**」 のように記述します。
# - 「\1」は、パターンの中でキャプチャした1番目のグループ((.*?)の部分)を
# ここに挿入するという意味です。
replacement = r'「**\1**」'
# 3. re.sub() を使って、テキスト内の全パターンを置換
fixed_text = re.sub(pattern, replacement, text)
return fixed_text
# --- 実際にプログラムを動かしてみましょう ---
if __name__ == "__main__":
# 修正したいMarkdownテキストをここに貼り付けます
original_markdown = """
はい、承知いたしました。
いただいたStep 0からStep 9までのマニュアルの各ファイルを統合し、プログラミングが初めての方でも、ワクワクしながら最後まで読み進められるような、**「元気が出るPython冒険マニュアル」**として再構成しました。
AIという最高の相棒と一緒に、新しい世界へ旅立つ準備はできましたか?
さあ、冒険の書を開きましょう!
---
## 🚀 ようこそ!生成AIと始めるPython冒険の書 🚀
こんにちは、未来の開発者であるあなたへ!
このマニュアルは、単なるプログラミングの教科書ではありません。
あなたが**「生成AIを最強の相棒にして、アイデアを形にする力」**を手に入れるための、壮大な冒険の地図です。
"""
print("--- 修正前のテキスト ---")
print(original_markdown)
# 作成した関数を呼び出して修正を実行
corrected_markdown = fix_markdown_bold(original_markdown)
print("\n" + "========================================" + "\n")
print("--- 修正後のテキスト ---")
print(corrected_markdown)
実行結果
--- 修正前のテキスト ---
はい、承知いたしました。
いただいたStep 0からStep 9までのマニュアルの各ファイルを統合し、プログラミングが初めての方でも、ワクワクしながら最後まで読み進められるような、**「元気が出るPython冒険マニュアル」**として再構成しました。
AIという最高の相棒と一緒に、新しい世界へ旅立つ準備はできましたか?
さあ、冒険の書を開きましょう!
---
## 🚀 ようこそ!生成AIと始めるPython冒険の書 🚀
こんにちは、未来の開発者であるあなたへ!
このマニュアルは、単なるプログラミングの教科書ではありません。
あなたが**「生成AIを最強の相棒にして、アイデアを形にする力」**を手に入れるための、壮大な冒険の地図です。
========================================
--- 修正後のテキスト ---
はい、承知いたしました。
いただいたStep 0からStep 9までのマニュアルの各ファイルを統合し、プログラミングが初めての方でも、ワクワクしながら最後まで読み進められるような、「**元気が出るPython冒険マニュアル**」として再構成しました。
AIという最高の相棒と一緒に、新しい世界へ旅立つ準備はできましたか?
さあ、冒険の書を開きましょう!
---
## 🚀 ようこそ!生成AIと始めるPython冒険の書 🚀
こんにちは、未来の開発者であるあなたへ!
このマニュアルは、単なるプログラミングの教科書ではありません。
あなたが「**生成AIを最強の相棒にして、アイデアを形にする力**」を手に入れるための、壮大な冒険の地図です。
Python学習のためのポイント解説
この短いプログラムには、Pythonプログラミングの重要な要素が詰まっています。
-
import re
- Pythonで正規表現を扱うための標準ライブラリ
re
をインポートしています。外部ライブラリのインストールは不要です。
- Pythonで正規表現を扱うための標準ライブラリ
-
正規表現パターン
r'\*\*「(.*?)」\*\*'
-
r''
: 文字列の前にr
を付けると「Raw文字列」となり、バックスラッシュ\
を特別な意味を持つ文字として解釈しなくなります。正規表現ではほぼ必須のお作法です。 -
\*\*
: アスタリスク*
は正規表現で「0回以上の繰り返し」という特別な意味を持つため、アスタリスク文字自体にマッチさせたい場合は\
でエスケープします。 -
(.*?)
: これがキモです。-
()
: キャプチャグループを作成します。このカッコに囲まれた部分にマッチした文字列を、後で再利用できます。 -
.
: 任意の1文字にマッチします。 -
*?
: 直前の文字(この場合は.
)の0回以上の繰り返しに、最短でマッチします(非貪欲マッチ)。これにより、「
から最も近い」
までを範囲としてくれます。
-
-
-
置換文字列
r'「**\1**」'
-
\1
: これが「後方参照」です。正規表現パターンの中でキャプチャした1番目のグループ(今回は(.*?)
の部分)の内容を、この場所に挿入します。 - 結果として、「
**「
」と「」**
」で囲まれていた文字列が、「**
と**」
で囲まれる形に再構築されます。
-
-
re.sub(pattern, replacement, text)
-
re
モジュールのsub
関数(substitute: 置換する の略)です。 -
text
という文字列の中からpattern
に一致する部分を全て探し、replacement
の形式に置換した新しい文字列を返します。
-
-
if __name__ == "__main__":
- これはPythonの定型句です。このファイルが直接実行されたとき(
python a.py
のように)にだけ、このブロック内のコードが実行されます。他のファイルからこの関数がimport
されたときには実行されません。これにより、テスト用のコードと再利用可能な関数を同じファイルに書くことができます。
- これはPythonの定型句です。このファイルが直接実行されたとき(
このプログラムを通じて、ご自身の課題を解決しながら、Pythonの強力な文字列操作機能である正規表現の基本を学ぶことができたかと思います。ぜひ、このコードを改造して、他の記号(例えば
『』
など)にも対応できるように挑戦してみてください!
実はこの問題、**「
を「**
に、」**
を**」
に置き換えればいい問題です。でも、これだけ丁寧に教えてもらえるというのは、すばらしいことです。逆に言えば、大抵のことは、指示すればコードを書いてくれます。
AIは、共に冒険してくれる最高の「相棒」になりました。かつての私のように、何かに挑戦することを諦めかけているなら、この新しい世界の扉を叩いてみてください。きっと、想像以上の未来が待っていると思います。大切なのは熱い思いで、技術ではありません。