<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ＮＣデータ | じじぃの引出し</title>
	<atom:link href="https://www.kazuban.com/blog/tag/nc-data/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kazuban.com/blog</link>
	<description>なにかしら、皆さんの参考になれば幸いです！</description>
	<lastBuildDate>Thu, 05 Feb 2026 00:40:01 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.kazuban.com/blog/wp-content/uploads/2020/05/cropped-ICON-1-32x32.png</url>
	<title>ＮＣデータ | じじぃの引出し</title>
	<link>https://www.kazuban.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python正規表現に挑戦 ― Fanuc系NCブロックをNCワードに分解させる</title>
		<link>https://www.kazuban.com/blog/python-regex/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 00:40:01 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[NC]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ＮＣデータ]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[正規表現]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=12021</guid>

					<description><![CDATA[このサイトでは、NCデータの解析・変換などの自作アプリを公開しています。これまでは C++Builder で自作ライブラリを作成し開発してきました。独学ゆえに効率や可読性など課題は沢山ありますが、いまさら見直す気にもなり [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このサイトでは、<a href="https://www.kazuban.com/blog/free_soft/">NCデータの解析・変換などの自作アプリを公開</a>しています。<br>これまでは C++Builder で自作ライブラリを作成し開発してきました。<br>独学ゆえに効率や可読性など課題は沢山ありますが、いまさら見直す気にもなりません。<br>最近は Python の学習もかねてNCデータ解析ライブラリのpythonへの移行を考えています。<br>AI の登場で、素人でも高度なコードを得られる時代になりましたが、意味を理解せずに使うのはやはり危険ですし、プログラミングスキルは向上しません。<br>この記事を書くきっかけは<br>「Fanuc系NCブロックをNCワードに分割させる、pythonスクリプトをだして」<br>へのAIの回答に正規表現が使われていた事から始まりました<br>本記事では、「一見意味不明な呪文のような正規表現」を理解して行く過程を記事にしました。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">正規表現</a><ol><li><a href="#toc2" tabindex="0">概要</a></li><li><a href="#toc3" tabindex="0">1. 文字列とリテラル</a></li><li><a href="#toc4" tabindex="0">2. メタ文字（特別な意味を持つ記号）</a><ol><li><a href="#toc5" tabindex="0">具体例</a></li></ol></li><li><a href="#toc6" tabindex="0">3. 繰り返し回数の指定（量指定子）</a><ol><li><a href="#toc7" tabindex="0">具体例</a></li></ol></li><li><a href="#toc8" tabindex="0">4. 文字クラス</a></li><li><a href="#toc9" tabindex="0">5. 代表的なエスケープシーケンス</a></li><li><a href="#toc10" tabindex="0">6. エスケープが必要な記号</a></li><li><a href="#toc11" tabindex="0">補足</a></li></ol></li><li><a href="#toc12" tabindex="0">ファナック系、NCデータ構造</a><ol><li><a href="#toc13" tabindex="0">
「ワード」＝「アドレス」+「数字・数値」
「ブロック」＝「ワード」の集まり
「NCデータ」＝「ブロック」の集まり
</a></li></ol></li><li><a href="#toc14" tabindex="0">ブロックから正規表現でワードに分解する</a><ol><li><a href="#toc15" tabindex="0">アドレスと数字抽出</a></li><li><a href="#toc16" tabindex="0">さらに、アドレスと数字を分けて抽出したい場合</a></li><li><a href="#toc17" tabindex="0">軸（X,Y,Z・・）の小数点にも対応させる</a></li><li><a href="#toc18" tabindex="0">複雑な正規表現の可読性を高める</a></li><li><a href="#toc19" tabindex="0">さらにちょっと特殊な、G や M　コードにも対応させてみます</a></li><li><a href="#toc20" tabindex="0">正規表現のraw文字列の変数化</a></li></ol></li><li><a href="#toc21" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">正規表現</span></h2>



<p>正規表現の情報は、ネット上に豊富にあると思うので、詳細は検索してみてください。<br>下記は「正規表現」の説明をAIに聞いてみた回答です</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h3 class="wp-block-heading"><span id="toc2"><a>概要</a></span></h3>



<p>本チャットログでは、「正規表現（Regular Expression）」の基本要素について、最小限かつ代表的な機能に絞って説明している。主な用途は文字列の検索・置換・抽出であり、「文字列パターンを表現する小さな言語」として位置付けている。</p>



<h3 class="wp-block-heading"><span id="toc3"><a>1. </a>文字列とリテラル</span></h3>



<ul class="wp-block-list">
<li>abc
<ul class="wp-block-list">
<li>文字列「abc」にそのままマッチするパターン。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc4"><a>2. </a>メタ文字（特別な意味を持つ記号）</span></h3>



<ul class="wp-block-list">
<li>. : 任意の1文字</li>



<li>^ : 行頭</li>



<li>$ : 行末</li>



<li>* : 直前要素の0回以上の繰り返し</li>



<li>+ : 直前要素の1回以上の繰り返し</li>



<li>? : 直前要素の0回または1回</li>



<li>| : OR（または）</li>



<li>() : グループ化・キャプチャ</li>
</ul>



<h4 class="wp-block-heading"><span id="toc5"><a>具体例</a></span></h4>



<ul class="wp-block-list">
<li>a.*b
<ul class="wp-block-list">
<li>「a」で始まり「b」で終わる行全体にマッチ（間の文字列は任意長）</li>
</ul>
</li>



<li>colou?r
<ul class="wp-block-list">
<li>color または colour にマッチ（u がある/ない両方に対応）。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6"><a>3. </a>繰り返し回数の指定（量指定子）</span></h3>



<ul class="wp-block-list">
<li>{n} : ちょうど n 回</li>



<li>{n,} : n 回以上</li>



<li>{n,m} : n〜m 回</li>
</ul>



<h4 class="wp-block-heading"><span id="toc7"><a>具体例</a></span></h4>



<ul class="wp-block-list">
<li>\d{3}-\d{4}
<ul class="wp-block-list">
<li>123-4567 のような「数字3桁-数字4桁」形式にマッチ。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc8"><a>4. </a>文字クラス</span></h3>



<ul class="wp-block-list">
<li>[abc] : a か b か c のいずれか1文字</li>



<li>[^abc] : a,b,c 以外の1文字</li>



<li>[0-9] : 数字</li>



<li>[A-Za-z] : 英字（大文字・小文字）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc9"><a>5. </a>代表的なエスケープシーケンス</span></h3>



<p>多くの処理系で共通して使われるもの。</p>



<ul class="wp-block-list">
<li>\d : 数字 [0-9]</li>



<li>\w : 単語構成文字（英数字 + _）</li>



<li>\s : 空白文字（スペース・タブ・改行など）</li>



<li>\D : 非数字（\d 以外）</li>



<li>\W : 非単語構成文字（\w 以外）</li>



<li>\S : 非空白文字（\s 以外）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc10"><a>6. </a>エスケープが必要な記号</span></h3>



<p>次の文字はメタ文字として特別な意味を持つため、そのままの記号として扱うにはバックスラッシュでエスケープする必要がある。</p>



<ul class="wp-block-list">
<li>対象文字
<ul class="wp-block-list">
<li>. * + ? ^ $ ( ) [ ] { } | \</li>
</ul>
</li>



<li>使用例<ul><li>\. : ドットそのものにマッチ</li></ul>
<ul class="wp-block-list">
<li>\? : 疑問符そのものにマッチ</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc11"><a>補足</a></span></h3>



<p>ここまでが「基本の道具」としての正規表現の要素一式であり、今後はこれらを組み合わせて「メールアドレスの簡易チェック」など、実用的なパターン作成にも応用できると示唆している。</p>
</blockquote>



<p>個別でみれば、なんとなくわかる気もしますが、これが組み合わさると、まったく呪文です<br>ただ、いろんなパターンの質問とAIの回答を照らし合わせると、なんとなく理解できてくるので、正規表現にかぎらず、AIは言語学習資料としても本当に役立ちます。</p>



<h2 class="wp-block-heading"><span id="toc12">ファナック系、NCデータ構造</span></h2>



<p>NCデータの分析ソフトを検討する場合、NCデータ構造の知識は必須です<br>NCデータの知識がないまま、AIの回答だけで進めると、間違いなく後々苦労します<br>ファナック系のプログラム構造は、下記記事でも紹介しています</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/nc-gcode-01/#toc2" title="NCプログラム／プログラム構造" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="102" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1.png 879w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1-300x266.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1-768x681.png 768w" sizes="(max-width: 102px) 100vw, 102px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">NCプログラム／プログラム構造</div><div class="blogcard-snippet internal-blogcard-snippet">最近の投稿は、覚書きとしても残しておきたかったので、素人ながらLinux系の投稿が連続していましたが、今回は気分を変えて、今まで携わってきたＮＣ関連の記事を書こうと思います。ＮＣプログラムとは？ＮＣ工作機械のコントローラへの指令の集まりです。プログラムとありますが、ファナック系は基本的には命令コード...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2019.11.30</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading has-text-align-left"><span id="toc13">
「ワード」＝「アドレス」+「数字・数値」<br>
「ブロック」＝「ワード」の集まり<br>
「NCデータ」＝「ブロック」の集まり
</span></h3>



<p>NCブロックからNCアドレスを抽出する課題なので、NCコードを少し復習しておきます</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="262" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-1024x262.png" alt="" class="wp-image-1338" srcset="https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-1024x262.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-300x77.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-768x197.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1.png 1385w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>ブロックの末尾は制御器では「EOB」ですが、PC側では改行コードになります<br>改行コードはOSにより変わりますが、基本的にアスキー形式での転送で大丈夫だと思います<br>NCデータの最小単位は、「ワード」と呼ばれていて、<br>「アルファベット一文字」+「数字、符号、小数点」が一塊になっている要素です<br>例えば「G02」とか「X-12.345」の構成です。<br>先頭のアドレス文字で機械への指令の種類を表し、ワードで具体的な指令になります<br>この「ワード」が集まり、一行の構成になった文字列が「ブロック」と呼ばれます<br>さらに、「ブロック」が複数行あつまって、NCデータになります<br>CAM利用の場合、作成したNCデータファイルをNC機械へ転送し加工動作を制御します<br>分析ソフトを検討する場合、まずはNCデータをブロックに、ブロックをワードに分解したほうが整理しやすいです<br>今回の課題では、<span class="marker-under-red">正規表現</span>を利用して<span class="marker-under">「ブロック」を「ワード」に分解する</span>コードを作成します<br>やりたい事をAIに投げかけると、それなりの回答をもらえます。<br>ただ、ＮＣコードのように、機種依存や複雑な表現がある場合、AIへすべて完ぺきなコードを期待してもなかなか思うような回答は得られません。<br>また、最初は良くても開発を進めていくうちに、改造したくなる場合もあります<br>やはり、ある程度の理解は必要です。</p>



<h2 class="wp-block-heading"><span id="toc14">ブロックから正規表現でワードに分解する</span></h2>



<p>具体的に正規表現を書き、「ワード」に分解した結果と照らし合わせながら理解を進めようと思います<br>「ワード」＝「大文字アルファベット一文字」+「数字」なので、一番単純な正規表現のパターンは、&#8221;[A-Z]\d&#8221;になります<br>また、正規表現パターンで、文字列から部分文字列を抽出するのに、AIは「re.findall関数」を教えてくれました<br>（findall関数についての詳細は、ネット検索やAIに聞いてみてください）<br>サンプル文字列は複数のパターンを織り交ぜた、&#8221;G0G1G00 G03M3 T102M30&#8243;　でやってみます<br>（文字列並びのみのサンプルで、NCデータとしては意味ありません）</p>



<h3 class="wp-block-heading"><span id="toc15">アドレスと数字抽出</span></h3>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G0', 'G1', 'G0', 'G0', 'M3', 'T1', 'M3']</code></pre>



<p>ちょっと期待とは違いますが、とりあえずは、アドレスと数字がリストで取り出せました<br>たった一行で分解された文字列リストが作成されました、すごいですね～<br>一文字づつ文字列操作で処理させたら、結構なコード量になっていると思います<br>ただ、「\d」としたため、「数字は<strong>一文字</strong>」しか抽出してくれませんでした<br>ここで「\d{2}」としてみると、「数字二文字」のみ取り出してくれます<br>今回の例ですべて取り出すには「\d{1,3}」とすればすべてヒットします<br>「\d+」でも同様の結果になりますが、こちらの方は文字数制限はなくなります<br>今回のサンプルでは、&#8221;[A-Z]\d+&#8221;で行こうと思います<br>ちなみに、「\d{0}」とすると、アドレスのみ取り出せます。</p>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G0', 'G1', 'G00', 'G03', 'M3', 'T102', 'M30']</code></pre>



<h3 class="wp-block-heading"><span id="toc16">さらに、アドレスと数字を分けて抽出したい場合</span></h3>



<p>グループ化と呼ばれる（丸括弧）でパターンを囲むと「tuple」として分離してくれます<br>抽出した後の処理内容によっては、こちらが便利かもしれません</p>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>(&#91;A-Z])(\d+)</strong>", block)
print(f"{words}")
for addr, val in words:
    print(f"addr={addr}:val={val}")

#---------- 結果 --------------
#&#91;('G', '0'), ('G', '1'), ('G', '00'), ('G', '03'), ('M', '3'), ('T', '102'), ('M', '30')]
#addr=G:val=0
#addr=G:val=1
#addr=G:val=00
#addr=G:val=03
#addr=M:val=3
#addr=T:val=102
#addr=M:val=30</code></pre>



<h3 class="wp-block-heading"><span id="toc17">軸（X,Y,Z・・）の小数点にも対応させる</span></h3>



<p>ここまでは、GやMコードでしたが、軸指令に対応するには、<span class="marker-under">符号や小数点</span>も考慮する必要があります<br>余談ですがプログラミング初心者の場合勘違いしやすいのが、<span class="marker-under-red"><strong>数字</strong>と<strong>数値</strong>の違い</span>です。<br>「12.23」の場合、<strong>数値</strong>としては「12 + 0.23」のように演算ができますが、<br><strong>数字</strong>の場合は、「1」「2」「.」「2」「3」と途中に「.」があるだけのただの数字文字の連続です<br>正規表現の場合も、数字・符号・小数点の<strong>文字の集まり</strong>として処理するので、数値で考えてしまうと期待と違う結果になり、悩む事になります<br>さて、文字を意識してサンプル文字列データに軸指令を追加して、上記のコードで実行してみます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 <strong>X12.5Y+20.3Z-5.63</strong>F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12', 'F1000']</code></pre>



<p>やはりこのコードでは、±符号と小数点が入るとマッチしないので、省かれてしまいますね<br>まず符号に対応するためにはアドレス「A-Z」の後に[+-]を追加します</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'Y+20', 'Z-5']</code></pre>



<p>これでは、符号「+-」が必須に判断され符号付の文字列しかヒットしませんでした<br>符号文字は<span class="marker-under">「無くてもいい」</span>の意味で<span class="marker-under"><strong>[+-]?</strong></span>としてみます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12', 'Y+20', 'Z-5', 'F1000']</code></pre>



<p>符号部分を<span class="marker">[+-]?</span> とすることで、符号がなくてもマッチするようになりました<br>次に小数点とそれ以下にも対応させてみましょう<br>NC制御器は、数値として扱いますが、文字としての小数点の扱いは結構面倒です。<br>小数点がある場合、ない場合、小数点から始まる場合、小数点で終わる場合・・など<br>まずは、小数点の有無に対応させるため、「<strong>\d+\.\d+</strong>」を考えましたが、<br>この場合、小数点がないとマッチしなくなります<br>そこで「？を付加」すれば「無くてもいい」にも対応できます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+\.?\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
&#91;'G90', 'G01', 'X12.5', 'Y+20.3', 'Z-5.63', 'F1000']
</code></pre>



<p>だいぶ理想に近づいてきましたが、「X.124」や「23.」など、小数点での始まりや終わりには対応できません<br>サンプル文字列に追加して確かめてみましょう</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+\.?\d+"</strong>, block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', '<span class="marker-red">J22</span>', 'F1000</code></pre>



<p>やはり、「I.5」にはマッチせず「J22.」の「.」は省かれていますね<br>ここも余談ですが、NCで「<strong>22.</strong>」を「<strong>22</strong>」に変換してしまった場合、制御器によってはとんでもない事になりかねないので十分意識しておく必要があります。<br><br>整理してみると</p>



<ul class="wp-block-list">
<li>[A-Z]：NCコードのアドレス</li>



<li>[+-]?：必須ではない、符号</li>



<li>\d+：複数個の数字<br>ここまでで、「Gコード」「Mコード」には対応できている</li>



<li>\.?：小数点は必須でない</li>



<li>\d+：複数個の数字</li>
</ul>



<p>やはり、「小数点で終わる」場合「\.?」なので、省略されてしまいますね<br>ではどうすればいのか？<br>AIに聞いたところ、グループ化と言う方法があり、&#8221;( )&#8221;で囲む事で、一塊としてでマッチングのルール設定できるようです<br>ただし、&#8221;( )&#8221;では、囲みごとに分割されタプルのリストとして抽出されます<br>グループごとに分割させたくない場合には<span class="marker-under"><strong>&#8220;(?: )</strong>&#8220;で囲む</span>仕様があり<span class="marker-under">非キャプチャグループ</span>と呼ばれマッチングのルールには使用するが分割はされないようです。<br>今回の例では、分割させたくないので、&#8221;<strong>(?: )</strong>&#8220;を使ってみます<br>最後の「\d+：複数個の数字」をグループ化して、必須ではない複数個の数字として設定します</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"&#91;A-Z]&#91;+-]?\d+\.?<strong>(?:\d+)?</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', '<span class="marker"><strong>J22.</strong></span>', 'F1000']</code></pre>



<p>これで、「22.」には対応できました。次は、小数点で始まる「.5」の場合です。<br>ここまででも、結構な呪文になっているのに、さらに複雑になりそうです。<br>ここもAIに相談すると、グループの中で（A | B）の書式で「AまたはB」とマッチング範囲の選択ができるようで、この書式での書き方を教えてくました</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"&#91;A-Z]&#91;+-]?(?:<span class="marker-under-blue">\d+\.\d+</span><strong>|</strong><span class="marker-under">\d+\.</span><strong>|</strong><span class="marker-under-red">\.\d+</span><strong>|</strong>\d+)", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', <span class="marker"><strong>'I.5'</strong>, <strong>'J22.'</strong></span>, 'F1000']</code></pre>



<ul class="wp-block-list">
<li>[A-Z]：NCコードのアドレス</li>



<li>[+-]?：必須ではない、符号</li>



<li>&#8212; ここからグループ化 &#8212;</li>



<li>\d+\.\d+：数字+小数点+数字<br>または</li>



<li>\d+\.：数字+小数点<br>または</li>



<li>\.\d+:小数点+数字<br>または</li>



<li>\d+：複数個の数字のみ</li>
</ul>



<p>書き方は他にもあると思いますが、グループ化して、マッチさせたいパターンを一つ一つORで区切るこの方法は私には理解しやすかったです</p>



<h3 class="wp-block-heading"><span id="toc18">複雑な正規表現の可読性を高める</span></h3>



<p>いちおう動作はしましたが、ここまでくると、読みにくいですね～<br>可読性を高める方法として、さらにAIが「re.VERBOSE」を提案してくれました<br>具体的に、上記のコードを書き替えてみます<br>パターンを一行づつに分割できて、行ごとにコメントも追記できるので、複雑になってもわかりやすくなります</p>



<pre class="wp-block-code"><code>pattern = re.compile(
    r"""
    &#91;A-Z]        # A-Zアドレス
    &#91;+-]?         # 符号
    (?:           # 小数点処理、非キャプチャグループ
      \d+\.\d+      # 数字、小数点、数字
      |\d+\.        # または、数字、小数点
      |\.\d+        # または、小数点、数字
      |\d+          # または、数字のみ
    )
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000']</code></pre>



<h3 class="wp-block-heading"><span id="toc19">さらにちょっと特殊な、G や M　コードにも対応させてみます</span></h3>



<p>通常、NCワードは「アドレス＋数字」ですが、拡張されたワーク座標系指令やサブプロ呼び出しなどちょっと特殊な構成のコードもあります<br>全てに対応は難しいと思いますが、「G54.1P1」や「M98P100」などにも対応してみようと思います。<br>これら対応するためには、上記のパターンでは処理できないのでパターンを追加します<br>やはり、可読性が上がる、re.VERBOSE を利用します</p>



<pre class="wp-block-code"><code>block = (
    "G05P10000 G90G01 X12.50Y+20.3Z-5.63 I.5 J22.F1000 G54 G54.1P12 M98P1100 M198 P2299"
)
pattern = re.compile(
    r"""
    # --- 特殊構成、G54.1P12 / M98P1234　など---
    &#91;GM]          # G や M アドレス
    \d+(?:\.\d+)? # 54　や　54.1 
    \s*P\d+       # スペースとP文字と数字
    # --- 通常のアドレス+数字 ----
    |&#91;A-Z]        # A-Zアドレス
    &#91;+-]?         # 符号
    # --- 小数点対応 ----
    (?:           # 非キャプチャグループ
      \d+\.\d+      # 数字、小数点、数字
      |\d+\.        # または、数字、小数点
      |\.\d+        # または、小数点、数字
      |\d+          # または、数字のみ
    )
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G05P10000', 'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000', 'G54', 'G54.1P12', 'M98P1100', 'M198 P2299']</code></pre>



<p>どうにかできました。<br>次の課題は「G04X10.」とかにも対応したいと思っていますが、これ以上条件が増えると大変です<br>正規表現パターンを変数化できれば、もう少しわかりやすいと思います</p>



<h3 class="wp-block-heading"><span id="toc20">正規表現のraw文字列の変数化</span></h3>



<p>AIに聞いてみました。さすがAI、できますよ！との回答をもらいました<br>AIの回答を参考に上記コードを書き直してみました。</p>



<pre class="wp-block-code"><code>block = (
    "G05P10000 G90G01 X12.50Y+20.3Z-5.63 I.5 J22.F1000 G54 G54.1P12 M98P1100 M198 P2299"
)
num = r"&#91;+-]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)"  # +12.123|-24.|.56|30
g54_1 = r"&#91;GM]\d+(?:\.\d+)?\s*P\d+\.?"      # G54.1P1 M98P1122
nomal = r"&#91;A-Z]"  # 通常のアドレス
pattern = re.compile(
    rf"""     
    {g54_1}         # G54.1P1 , M98P1122
    #----------------------
    |{nomal}{num}   # G01 , X-12.356
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
#---------- 結果 --------------
#&#91;'G05P10000', 'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000', 'G54', 'G54.1P12', 'M98P1100', 'M198 P2299']</code></pre>



<p>なるほど、だいぶ見やすくなりました<br>今後の仕様変更にも対応しやすくなったと思います<br>興味ある方は是非、「G04X10.」への対応もやってみてください。</p>



<h2 class="wp-block-heading"><span id="toc21">まとめ</span></h2>



<p>これまでも単純な正規表現に触れる機会はありましたが、複雑な記述はまるで「呪文」のようで、敬遠していました。 <br>しかし、正規表現は文字列操作において非常に強力な武器になります。<br>独学ではやる気なしでしたが、AIと対話する事で、ある程度は理解できてきました。<br> 今後もAIと対話しながら一歩ずつ分析していくことで、正規表現だけでなく、プログラミング言語全体の理解力も深めていけると感じています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ＧコードNCデータの確認と学習支援ソフトを作ってみた</title>
		<link>https://www.kazuban.com/blog/nc-check/</link>
					<comments>https://www.kazuban.com/blog/nc-check/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 17 Sep 2020 08:30:16 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[C++Builder]]></category>
		<category><![CDATA[ＮＣデータ]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[フリーソフト]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=3314</guid>

					<description><![CDATA[こちらで、ファナック系ＮＣデータで図形を定義する方法を説明しました。 NCプログラム／Gコード　工具経路指令前回は、NCプログラムの概要を説明しました。今回は工具経路の図形を定義する指令に使用されるＧコードについて説明し [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こちらで、ファナック系ＮＣデータで図形を定義する方法を説明しました。</p>



<figure class="wp-block-embed-wordpress wp-block-embed is-type-wp-embed is-provider-じじぃの引出し"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/nc-gcode-02/" title="NCプログラム／Gコード　工具経路指令" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="116" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData.png 2048w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-300x233.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1024x797.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-768x597.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1536x1195.png 1536w" sizes="(max-width: 116px) 100vw, 116px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">NCプログラム／Gコード　工具経路指令</div><div class="blogcard-snippet internal-blogcard-snippet">前回は、NCプログラムの概要を説明しました。今回は工具経路の図形を定義する指令に使用されるＧコードについて説明します。ここまで理解できれば、二次元の図形をＧコードで定義できるようになります。 絶対座標系と相対座標系 経路指令なので、「どこへ行け！」が基本になりますが「どこへ」の指令に２種類の指令方法...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2019.12.07</div></div></div></div></a>
</div></figure>



<p>絶対座標系(G90)の場合には、原点基準からのＸ軸やＹ軸の移動位置は、比較的イメージできますが、相対座標系(G91)モードの場合は、次の移動位置はわかりますが、全体的な図形形状はなかなかイメージできません。<br>さらに、「I」「J」円弧の場合はその中心と半径も、電卓を叩かないとわかりませんね。<br>NCデータの最終確認用として、加工輪郭の図形情報を表示するソフトを作ってみました。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ＮＣデータから、図形輪郭確認</a><ol><li><a href="#toc2" tabindex="0">図形要素</a></li><li><a href="#toc3" tabindex="0">円弧の中心・半径の求め方</a></li><li><a href="#toc4" tabindex="0">電卓による確認</a></li></ol></li><li><a href="#toc5" tabindex="0">ソフトを作ろう！</a><ol><li><a href="#toc6" tabindex="0">こんなイメージ</a></li><li><a href="#toc7" tabindex="0">小容量のデータが対象です。</a></li></ol></li><li><a href="#toc8" tabindex="0">NCプログラムの学習にも使用できそう！</a><ol><li><a href="#toc9" tabindex="0">エディタ機能</a></li><li><a href="#toc10" tabindex="0">例題</a></li><li><a href="#toc11" tabindex="0">エディタモード</a></li></ol></li><li><a href="#toc12" tabindex="0">ダウンロード</a></li><li><a href="#toc13" tabindex="0">開発環境</a></li><li><a href="#toc14" tabindex="0">まとめ</a><ol><ol><li><a href="#toc15" tabindex="0">注意点</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ＮＣデータから、図形輪郭確認</span></h2>



<p>最近は、ＣＡＤ／ＣＡＭを使用して、ＮＣデータを作成する場合がほとんどだと思いますが、２Ｄ輪郭形状で、工具径補正を利用して形状精度を加工する場合、最終的には、使用ＮＣデータと図面寸法を比較して確認したくなります。<br>確かに、ＣＡＤ上で輪郭スケッチと図面寸法を確認する事はできますが、ＮＣ機械はＣＡＤデータから直接動作するわけではありません。<br>ＣＡＤで輪郭を描いた後、ＣＡＭで工具径や補正、仕上げ代などを設定後、ポストプロセッサを経由して、最終的なＮＣデータが作成されます。<br>３Ｄ加工は、ＣＡＤ／ＣＡＭに任せるしかありませんが、精度が必要な２Ｄ輪郭は、ＮＣデータで確認したいと言うのが、このソフトの目的です。</p>



<h3 class="wp-block-heading"><span id="toc2">図形要素</span></h3>



<p>基本的に、２Ｄ輪郭は、直線と円弧の連続です。<br>直線は、絶対座標(G90)であれば、ＮＣ指示の数値で始点終点が簡単にわかるので、その形状も簡単に理解できます。<br>ところが、円弧補間はちょっと面倒です。<br>Ｇコードでの円弧指示は、「I」「J」方式と「R」方式があります。<br>「R」方式であれば、その半径はすぐにわかりますが、「I」「J」方式の場合は簡単にはわかりません。<br>ただ、円弧の中心位置は、「I」「J」方式のほうが簡単だと思いますし、制御機などによっては、「R」方式には対応していないものもあります。<br>今回は、「I」「J」方式のみで検討しています。</p>



<h3 class="wp-block-heading"><span id="toc3">円弧の中心・半径の求め方</span></h3>



<p><a href="https://www.kazuban.com/blog/nc-gcode-02/" data-type="URL" data-id="https://www.kazuban.com/blog/nc-gcode-02/">詳細はこちらに書きましたが</a>、円弧の半径は</p>



<figure class="wp-block-image is-resized size-large"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2019/12/半径.png" alt="" width="338" height="134"/></figure>



<p>で求めることができます。<br>また、円弧中心と「I」「J」の関係は</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2019/12/G02G03-1.png" alt=""/></figure>



<p>円弧の始点から見た、中心座標までの、相対位置です。<br>「I」はX軸、「J」はY軸になります。<br>逆算すると、円弧の中心座標を（Xｃ、Yｃ）とすると</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><br>Xc = 始点のX座標 + I<br>Yc = 始点のY座標 + J</p></blockquote>



<p><br>となります。<br>ただしこれは、日本国内では始点から見た「相対座標」が一般的なのでこうなりますが<br>海外の制御機の場合には、「絶対座標」の場合もあるので、注意が必要です。<br>このソフトは、「相対方式」の「I」「J」のみに対応しています。</p>



<h3 class="wp-block-heading"><span id="toc4">電卓による確認</span></h3>



<p>上記の計算式がわかれば、NCデータの一行（一ブロック）ごとに、計算する事で図形データと照合する事ができます。<br>部分的でも、この方法で確認する事で、ミスを見つける確率があがります。</p>



<h2 class="wp-block-heading"><span id="toc5">ソフトを作ろう！</span></h2>



<p>でもやっぱり、電卓は面倒。<br><a href="https://www.kazuban.com/blog/category/c-builder/">C++Builder を利用して</a>、輪郭の情報を表示するソフトを作成する事にします。<br>図面と照合する時に一番ほしいのは、円弧の中心と半径です<br>こんな仕様とします。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>この情報は、リアルタイムに表示するようにして、工具径補正モードかどうかも<br>分かるようにします。<br>相対座標系、絶対座標系、両方に対応できるようにします。<br>ただし、半径指示は、「I」「J」のみとします。<br>「R」指示は、１８０°以上とか以下とかいろいろ面倒そうなので、<br>非対応とします<br>そして、やっぱり、図形が描画できるようにしたいと思います<br>私のレベル的に、２D表示までです。<br>３Dはちょっと敷居が高いです。<br>次期バージョンでは対応したいと思っていますが<br>キャンパスサイズの変更や拡大縮小にも現バージョンでは未対応。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc6">こんなイメージ</span></h3>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/soft-image.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/soft-image-1024x690.png" alt=""/></a></figure>



<p>ソフトのウィンドウ上に、NCデータをドロップすれば、解析を始めます<br>キーボードの矢印キーで、一行づつ、表示していきます。<br>マウスでNCデータをクリックすると、そこまで連続で移動します。</p>



<h3 class="wp-block-heading"><span id="toc7">小容量のデータが対象です。</span></h3>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/big-size-data-1024x646.png" alt=""/></figure>



<p>大容量のデータでも表示できますが、私のソフト開発のレベルの問題でかなりレスポンスが悪いです。<br>私の環境で試したところ、600KB 30000行ぐらいのデータで、<br>読込みに、約30秒。全行描画に約1分　かかります。<br>基本的なポリシーは、NCデータの図形要素の確認なので、２D輪郭の確認用と言うことで了承ください。</p>



<h2 class="wp-block-heading"><span id="toc8">NCプログラムの学習にも使用できそう！</span></h2>



<p>新人さんが入社して来たとき、NCプログラムを指導した事がありました。<br>その時に、適当な図形の例題を出して、NCデータで図形を定義させたのですが<br>その確認が面倒でした。<br>その時は、別のシミュレーションソフトで、新人さんが作成したデータを確認したのですが、そういった用途にも使用できそうです。</p>



<h3 class="wp-block-heading"><span id="toc9">エディタ機能</span></h3>



<p>他のエディタで、NCプログラムを手入力して保存し、そのファイルをドロップすれば、一行づづ確認できますが、せっかくなのでこのソフトにも簡易エディタ機能を追加してみました。</p>



<h3 class="wp-block-heading"><span id="toc10">例題</span></h3>



<p>試しに、この図形を手打ちで定義してみましょう！<br></p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Sample.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Sample-1024x631.png" alt=""/></a></figure>



<h3 class="wp-block-heading"><span id="toc11">エディタモード</span></h3>



<p>ソフトが立ち上がったら、「Edit」を選択すると、入力モードになります</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/edit-mode-start.png" alt=""/></figure>



<p>最近手打ちなんてやってませんが、久しぶりに、例題の図形の輪郭を手打ちでＮＣプログラムしてみましょう！</p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Read.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Read.png" alt=""/></a></figure>



<p>入力途中でも、「読込み」ボタンで、確認モードに戻ります。<br>「確認モード」では、矢印キーで、一行づつ確認できます。<br>「Check」と「Edit」を行き来しながら、確認しながら手打ち作業ができます。</p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Error-1.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Error-1.png" alt=""/></a></figure>



<p>円弧補間で入力ミスや定義がおかしいと、中心や半径が黄色の表示になります。<br>再度、「Edit」モードに移り、修正します。</p>



<h2 class="wp-block-heading"><span id="toc12">ダウンロード</span></h2>



<div class="wp-block-media-text alignwide is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="410" height="275" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/DownLoad.png" alt="" class="wp-image-3399 size-full" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/09/DownLoad.png 410w, https://www.kazuban.com/blog/wp-content/uploads/2020/09/DownLoad-300x201.png 300w" sizes="(max-width: 410px) 100vw, 410px" /></figure><div class="wp-block-media-text__content">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><a href="https://www.kazuban.com/blog/free_soft/#Soft04">こちらから、ダウンロードできます。</a><br><a href="https://www.vector.co.jp/soft/winnt/business/se521853.html">Vector へは新バージョンの登録が完了しました</a></p></blockquote>
</div></div>



<h2 class="wp-block-heading"><span id="toc13">開発環境</span></h2>



<p><a href="https://www.embarcadero.com/jp/products/cbuilder/starter" data-type="URL" data-id="https://www.embarcadero.com/jp/products/cbuilder/starter">C++Builder Community Edition を使用しています</a><br>このような、ソフトウェア開発環境を無料で提供していただいて<br>感謝！です。</p>



<h2 class="wp-block-heading"><span id="toc14">まとめ</span></h2>



<p>NCデータの座標確認を簡単にできないか？<br>の目的でこのソフトを作成しました。<br>おまけとして、エディタ機能も追加したので、手打ちでのNCプログミングやＧコードの学習にも使用できると思います。</p>



<h4 class="wp-block-heading"><span id="toc15">注意点</span></h4>



<ul class="wp-block-list"><li>XY平面（G17）のみの対応です。<br>Z軸も情報としては表示しますが、描画は、XYのみとなります。</li><li>始点と終点が同じ、３６０°真円には対応していません。<br>半円に分割して定義してください。</li><li>ファナック系の場合、座標値指令の小数点の「有り」「無し」で<br>単位が変わる場合がありますが、このソフトは対応していません。<br>互換性のためには、基本的に小数点使用をお勧めします。</li><li>等高線などの、３Dパスも読み込み可能ですが、データ容量が多くなるとレスポンスはかなり悪くなります。<br>待てない場合には、「強制終了」で終了してください。</li><li>拡大・縮小や、キャンパスのサイズがデフォルトよりも大きくできません<br>プログラムミング方法を検索中です。<br>できそうであれば、次回バージョンで対応予定です。</li></ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/nc-check/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
