質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

5回答

2539閲覧

正規表現にヒットする文字の組み合わせ表を作りたいです。

hajimetea

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2017/12/19 00:28

編集2017/12/19 06:50

###前提・実現したいこと
正規表現にヒットする文字の組み合わせ表を作りたいです。
プログラム言語は、なんでもよいです。

例えば
(今日|明日)[はも]?(あつい|さむい)
という正規表現を入力すると

今日あつい
今日はあつい
今日もあつい
今日さむい
今日はさむい
今日もさむい
明日あつい

といった一覧表を出力したいです。

###発生している問題・エラーメッセージ

sre_yield というライブラリで、ほぼ出来たのですが [はも]?の部分が変です。 どうしたら良いかおわかりでしたら教えて頂けると。

###該当のソースコード

python

1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3 4import sre_yield 5# pip install https://pypi.python.org/packages/source/s/sre_yield/sre_yield-1.0.tar.gz 6 7regex = r'(今日|明日)[はも]?(あつい|さむい)' 8textList = list(sre_yield.AllStrings(regex)) 9print str(textList).decode('string-escape')

python

1出力結果 2['今日あつい', '明日あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日さむい', '明日さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい']

###試したこと

そもそも、こういうのをなんて呼べばいいかわからないので検索もできないです。
なんてよぶのでしょうか。

追記

sre_yieldを教えていただいたのでためしてみました。
文字化けみたいになるのでそこを解決したいです。

###補足情報(言語/FW/ツール等のバージョンなど)

こういったことが出来るサイトやツールとかでもいいので、教えてほしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

defghi1977

2017/12/19 00:31

素朴な疑問として「.*」を指定した場合, この世に存在する全ての文字列をリストアップすることになりませんか?
hajimetea

2017/12/19 00:33

そんな実装するひといるかなあ。
defghi1977

2017/12/19 00:34

そうじゃなくて「何らかの縛りを入れないと実現できない」と言っているんです
hajimetea

2017/12/19 00:45

「こういう縛りがありますが、こういう表が作れますよ。」的なのを教えていただきたいです。
guest

回答5

0

任意の正規表現というのは、解析がめんどくさいし、もしやっても生成は無理ですよね。
簡単なa*でも無限個出来ちゃう。

・グルーピングの( )
・選択の|
・文字クラスの[ ]。ただし[^ ]は不可
・あってもなくてもの?

くらいに制限すると、見えてくるのではないでしょうか。
.とか*とか+は不可にしないと。

最初は( )のネスティングを不可にすると解析も楽かと思います。
・繰り返しの{n,m}。ただしmは省略不可
くらいもできるかと。

キーワードとしては、「オートマトン」でしょうか。

投稿2017/12/19 00:43

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hajimetea

2017/12/19 00:46

キーワードありがとうございます!
hajimetea

2017/12/19 00:48

そうですね、この仕様で表が作れたら嬉しいです
guest

0

ベストアンサー

"正規表現 展開"でググったらすぐにこんなの見つかりましたが。
https://qiita.com/ohkawa/items/368e6bcadc56a118adaf

追記
実際に使ってみました。

python

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3 4import sre_yield 5if __name__ == '__main__': 6 for regex in [ 7 '[abc]x', 8 '(あ|い|う)x', 9 '(あいう)?x', 10 '[あいう]x' 11 ]: 12 urllist = list(sre_yield.AllStrings(regex)) 13 print("TEST " + regex) 14 for i in range(len(urllist)): 15 print(urllist[i])

ubuntu 14.04/python 2.7.6で試してみた結果は以下のとおり。

TEST [abc]x ax bx cx TEST (あ|い|う)x あx いx うx TEST (あいう)?x x あいうx TEST [あいう]x �x �x �x �x �x �x �x �x �x

どうもutfへの対応が不完全ぽいですね。
□な中にいわゆる全角文字を置くとおかしくなるようです。
またprint(urllist[0])だとokなのがprint(urllist)ではひらがなが表示されないとか、不思議な事が起こります。 pythonのutf8の扱いは私にとって謎が多いです。

投稿2017/12/19 05:12

編集2017/12/19 16:47
KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/19 05:21

このライブラリ、面白いですね!
hajimetea

2017/12/19 06:27

展開!ありがとうございます。
hajimetea

2017/12/19 06:51

やってみたら、これでした!文字化け的な感じになってしまい、解決策を模索しています。
hajimetea

2017/12/20 00:47

ためしてみていただきありがとうございます。utf対応してないみたいなんですよね でも、便利でした!
can110

2017/12/20 01:39

最新ソースhttps://github.com/google/sre_yield/からインストールするとよいです。 python3.5.2にて質問での提示例含め、日本語が含まれていても正常に動作しました。
KojiDoi

2017/12/20 03:24

> 最新ソースhttps://github.com/google/sre_yield/からインストールするとよいです。 そうしたのですが、上記のような結果でした。何がいけないのでしょうね。
can110

2017/12/20 03:37

pythonバージョンの違いにより挙動が異なるようですね。 2.7であれば「u'(あ|い|う)x'」のようにユニコード文字として渡すか 引数にcharsetなるものがあるようなので、これで明示的に文字コードを指定するとうまくいくかもしれません。
KojiDoi

2017/12/20 06:22

> pythonバージョンの違いにより挙動が異なるようですね。 python3でも試したつもりになっていましたが、2でしか検証できていませんでした。 python3.4.3で試したところ正常に動作しました。
hajimetea

2017/12/22 05:36

ありがとうございます。やってみます。
hajimetea

2017/12/22 06:04

できました!ありがとうございました。
guest

0

正規表現をそのまま適用すると、「.*」のような表現がある以上無理です。
その一部の表現を切り出し使用するのであれば、愚直に構文を解析するだけです。

投稿2017/12/19 00:39

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

構文木(構文グラフ)なりBNFなりを作って深さ優先探索をすればOKですが、往々にして無限に答えが出てくるので「10文字以内」とか制限をつけないとだめでしょうね。
本当にイチから書きたければ、
形式言語理論(形式文法)あたりを図書館で独学してみたらどうでしょうか。

投稿2017/12/19 05:36

a_saitoh

総合スコア702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hajimetea

2017/12/19 06:28

ありがとうございます!
guest

0

逆に考えたらどうでしょうか?
文字列を作るのではなく、既存の文字列を使うのです。

bigデータ(たとえばGoogleのような検索エンジンを使い、適当な
条件(これは何でもよい)で検索した結果)を元ネタのテキストとし、
これに対して入力された正規表現を適用してマッチしたテキストを
収集する。というのはどうですかね? (時間とリソースが必要とは
思いますが)
.*等の対策としては、テキストをある程度短く分断して食わせば
いいと思います。

自己レス

「一覧表」とは、入力した正規表現にマッチする、すべての
パターンの組み合わせという意味ですかね?。だとすると、
上記ではダメですね...

投稿2017/12/19 01:36

編集2017/12/19 01:45
h.horikoshi

総合スコア505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hajimetea

2017/12/19 01:46

面白いアイデアだけど、だめですね・・・ 正規表現上手にできたかチェックしたいのです
yambejp

2017/12/19 01:53

> 正規表現上手にできたかチェックしたい そうなると、単にご自身のかいた正規表現がマッチするかどうかではなく 想定していない文字列がマッチしないこともチェックしなくてはいけません ですのでマッチする可能性がある文字列を生成しても十分な検証にはなりません
hajimetea

2017/12/19 02:09

あ、それは理解してますー。無限の可能性は理解していて 例として、この表のやつは確実にとおるよ!みたいな感じになったらいいなあと
ExcelVBAer

2017/12/19 06:06

無限の可能性のことは言ってませんよ? かつ、要望を正確に書かないから、欲しい答えが返ってきにくいんですよ。 ①「正規表現上手にできたかチェック」と ②「この表のやつは確実にとおる」は 意味が全然違いますよ? 他の方々とのやりとりを見る限り、 正規表現が難しいから、 設定値から一覧を作って、 意図した通りに設定できているか確認したいんですよね? まぁがんばってください学生さん。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問