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

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

ただいまの
回答率

90.83%

  • PHP

    18240questions

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

  • JavaScript

    14315questions

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

  • VBA

    1477questions

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

  • 正規表現

    706questions

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

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

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 487

hajimetea

score 1

前提・実現したいこと

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

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

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

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

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

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

該当のソースコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sre_yield
# pip install https://pypi.python.org/packages/source/s/sre_yield/sre_yield-1.0.tar.gz

regex = r'(今日|明日)[はも]?(あつい|さむい)'
textList = list(sre_yield.AllStrings(regex))
print str(textList).decode('string-escape')
出力結果
['今日あつい', '明日あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日?あつい', '明日?あつい', '今日さむい', '明日さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい', '今日?さむい', '明日?さむい']

試したこと

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

追記

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • defghi1977

    2017/12/19 09:34

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

    キャンセル

  • hajimetea

    2017/12/19 09:45

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

    キャンセル

  • 退会済みユーザー

    2017/12/19 15:17

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 5

+6

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 09:46

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

    キャンセル

  • 2017/12/19 09:48

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

    キャンセル

checkベストアンサー

+5

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

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

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sre_yield
if __name__ == '__main__':
    for regex in [
      '[abc]x',
      '(あ|い|う)x',
      '(あいう)?x',
      '[あいう]x'
    ]:
      urllist = list(sre_yield.AllStrings(regex))
      print("TEST " + regex)
      for i in range(len(urllist)):
        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 14:21

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

    キャンセル

  • 2017/12/19 15:27

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

    キャンセル

  • 2017/12/19 15:51

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

    キャンセル

  • 2017/12/20 09:47

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

    キャンセル

  • 2017/12/20 10:39

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

    キャンセル

  • 2017/12/20 12:24

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

    キャンセル

  • 2017/12/20 12:37

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

    キャンセル

  • 2017/12/20 15:22

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

    キャンセル

  • 2017/12/22 14:36

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

    キャンセル

  • 2017/12/22 15:04

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

    キャンセル

+3

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 15:28

    ありがとうございます!

    キャンセル

+1

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 10:46

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

    キャンセル

  • 2017/12/19 10:53

    > 正規表現上手にできたかチェックしたい

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

    キャンセル

  • 2017/12/19 11:09

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

    キャンセル

  • 2017/12/19 15:06

    無限の可能性のことは言ってませんよ?

    かつ、要望を正確に書かないから、欲しい答えが返ってきにくいんですよ。
    ①「正規表現上手にできたかチェック」と
    ②「この表のやつは確実にとおる」は
    意味が全然違いますよ?

    他の方々とのやりとりを見る限り、
    正規表現が難しいから、
    設定値から一覧を作って、
    意図した通りに設定できているか確認したいんですよね?

    まぁがんばってください学生さん。

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18240questions

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

  • JavaScript

    14315questions

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

  • VBA

    1477questions

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

  • 正規表現

    706questions

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