python正規表現で全角カタカナの色名にマッチしない濁音の問題

このQ&Aのポイント
  • pythonの正規表現を使用して、全角カタカナの色名にマッチするパターンを作成しています。
  • しかし、濁音のカタカナにマッチしない問題が発生しています。
  • 正規表現のパターンを見直して、濁音のカタカナにもマッチするよう修正する必要があります。
回答を見る
  • ベストアンサー

pythonの正規表現、全角カタカナの指定。

下記のような正規表現で「全角カタカナの色名(アルファベットの色名)」で書かれている文字にマッチするものを作りたいのですが、カタカナの濁音にマッチしてくれません。 iro=re.compile("[ァ-ヴー×]+\([A-Z/]+\)|カラーなし") 例 ベリー(BERRY)/ ブラック(BK)/ ブルー(BL)/ フォレスト(FOST)/ グリーン(GN)/ グレー(GY)/ ピンク(PK)/ パープル(PU)/ タンジェリン(TGR) ↓ リー(BERRY)ラック(BK)ブルー(BL)グリーン(GN)グレー(GY)ンク(PK)ープル(PU)タンジェリン(TGR) このように中途半端にパブべが除かれてマッチします。いったいどういうことなんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

http://okwave.jp/qa/q7612841.html でも書いたのですが、2.xでは、strとunicodeの2種類の文字列があります。 日本語の場合 str: 1文字が複数バイトの文字として扱われます。 unicode: 1文字が1文字として扱われます。 検索パターンをreprで比べると strでは '[\xe3\x82\xa1-\xe3\x83\xb4\xe3\x83\xbc\xc3\x97]+\\([A-Z/]+\\)|\xe3\x82\xab\xe3\x83\xa9\xe3\x83\xbc\xe3\x81\xaa\xe3\x81\x97' (UTF-8の場合) unicodeでは u'[\u30a1-\u30f4\u30fc\xd7]+\\([A-Z/]+\\)|\u30ab\u30e9\u30fc\u306a\u3057' とまったく違うのがわかります。 strでは 「ァ」 は \xe3\x82\xa1 と3文字であり、 「ァ-ヴ」 とやっているつもりで、 実際は「\xa1-\xe3」になっています。 unicodeでは \u30a1 と一文字扱いされています。 検索される側の文字列も同様です。 strでは ベリー が \xe3\x83\x99\xe3\x83\xaa\xe3\x83\xbc となります。 \x99は上の[]内の文字に一致するものはありあせん。パターンに一致するのは \xe3\x83\xaa\xe3\x83\xbc となり、これをUTF-8で解釈すれば リーになります。 また、 \xe3\x83\x99 は unicodeの「ベ」ではないので、パターンだけunicodeにしてもマッチしません。 一般に、日本語を使った正規表現が期待通りに動くのは、パターン、対象文字列ともにunicode文字列のときだけです。 他の言語やツールでも、日本語に対応した方法を使わないと、同様の現象が発生します。

関連するQ&A

  • 全角カタカナの正規表現

    if (preg_match('/[ァ-ヶー]+/', $value, $match )) { print ("$value"."はカタカナです。"."($match[0])"."<br />") } else { print ("$value"."はカタカナではない。<br />"); } という感じで全角カタカナにマッチさせる正規表現を使いたいのですが、このやり方だと「全角カタカナを含んでいる…」という表現になってしまいます。ある文字列が「すべて全角カタカナである」という正規表現を考えているのですが、なかなかうまくいきません。逆引きのサンプルなんかでもなかなか見つからなくて困っています。  同様に「すべて平仮名にマッチ!」というのにも応用できると思うのですが、なかなかうまく行きません。  是非、そのやり方やヒントをおしえてください。  マルチバイト対応なので[ぁ-ん]のような形で表記できます。またPerl互換(preg_match)で作っているので、Perlに詳しい方も是非是非おしえてください。

    • ベストアンサー
    • PHP
  • Python上での正規表現でどのように書けば?

    PHPで作ったプログラムをGAE(Google App Engine)/Python で作り替えています。 PHPの置換処理で、たとえば、以下の正規表現をPythonで書きたいのですが、どのようにすればいいでしょうか? mb_ereg_replace("無([いかきくけこ])","な\\1",$str); この質問は、別の言い方をすると次のようにもなります。 「Pythonで以下をひとつの正規表現で表現したい」 str = re.sub('無い','ない',str) str = re.sub('無か','なか',str) str = re.sub('無き','なき',str) str = re.sub('無く','なく',str) str = re.sub('無け','なけ',str) str = re.sub('無こ','なこ',str) どなたか、お分かりになる方、教えて頂ければと思います。

  • python 正規表現

    pythonを使用して 単語 あ 語句 みち 空 ジャンプ 無理 ぃ お 暮らし ホーミング 石 防止 ー あなた というような3行からなるテキストデータ(例)を編集したいと思っています ここで ・ひらがな一文字 ・カタカナ一文字 の単語のみ削除しようと思いプログラムにかけると 単語 語句 空 無理 暮 石 防止 となってしまいます プログラムでは以下のようにしております for line in txtfile:  line = re.sub(u'[ぁ-ゞ]', u'', line)  line = re.sub(u'[ァ-ヾ]', u'', line) 本来ほしい結果は 単語 語句 みち 空 ジャンプ 無理 暮らし ホーミング 石 防止 あなた のような結果なのですがこのように他の単語には影響せず一文字のひらがな・かたかなのみを削除するようなコードのアドバイスをいただけないでしょうか? よろしくお願いいたします

  • python 正規表現

    http://okwave.jp/qa/q8693280.html 以前したこの質問を参考に正規表現を使ったプログラムを書いているのですが 以下のような3行からなるテキストデータ(例)から「ひらがな一文字」「かたかな一文字」の単語のみを除去したいと思っております。 (例) 単語 あ 語句 みち 空 ジャンプ 無理 ぃ お 暮らし ホーミング 石 防止 ゾ あなた URLの質問を参考に(\bでは除去できなかったので) for line in textfile:  line = re.sub(u'\s[ぁ-ゞ]\s', u' ', line)  line = re.sub(u'\s[ァ-ヾ]\s', u' ', line) としたらうまく「ひらがな一文字」「かたかな一文字」を除去できました。 しかし、次の例のように一つ目の単語にこれらがきた場合手前にスペースがないので除去できません(4行目の「ま」が除去できない) 単語 あ 語句 みち 空 ジャンプ 無理 ぃ お 暮らし ホーミング 石 防止 ゾ あなた ま 空白 みどり だからといって [ぁ-ゞ]\s のようにすると、例えば一行目は「単語 語句 み空 ジャンプ」のように一文字でない単語の最後にひらがな・カタカナがくるとその部分を除去し、後ろの単語と結合してしまうという不具合がおきてしまいます。 扱うデータ的に、行の頭にスペースを入れるということはしたくありません。(はじめに入れて後から消すといっても正規表現に当てはまった行はスペースがなくなり、そうでないところはあるといったバラバラな状況が発生するのでそれもしたくありません) これらをふまえて、うまく「ひらがな一文字」「カタカナ一文字」を除去する方法・正規表現はあるでしょうか。(今書いているプログラムはこのFor文のみなので、別で行が追加される分にはかまいません。) よろしくお願いします。

  • java での全角数値を指定する正規表現について

    はじめまして。 javaでの正規表現についての質問です。 現在私は String line = reader.readLine(); if ( line.matches("^[-]?[0-9]*[.]?[0-9]*") ) 上記のような半角の整数、浮動小数点数、マイナスの入力時にTrueとなり、それ以外はFalseとなるようにしています。 ここに「全角の整数、浮動小数点数、マイナス」もTrueとなるように記述したいのですがうまくいきません。 or 条件にて || line.matches("^[-]?[0-9]*[.]?[0-9]*") と、ただ半角の部分を全角に置き換えたところで改善するものではありませんでした。 どなたか良い改善策教えていただけましたら幸いです。

    • ベストアンサー
    • Java
  • 全角カタカナについて。

    懸賞とかに、自分の名前とかを入力する時、全角カタカナでとあるので、スペースキーや、F7とかで変換していたのですが、エラーが出て、何度もやり直してくださいとなってしまうのです。どうしたら全角カタカナに出来るか、解り易く教えてください。

  • phpの正規表現でカタカナ+スペース+カタカナ

    phpの正規表現で全角カタカナ+全角スペース+全角カタカナ というパターンを取り出したいのですが、 上手く取り出すことが出来ずに困っております。 どなたかご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • egrepで指定する正規表現

    linuxでvsftpdの設定ファイルを見るときに、次のコマンドを実行している人がいました。 # egrep -v "(^$|#)" /etc/vsftpd/vsftpd.conf 上記を指定するとvsftpd.confファイルのコメント行を省いた結果が得られ、大変見やすくなりました。 ここからが質問になりますが、上記のegrepの中で-v "(^$|#)" の指定は具体的に どういった意味になるのでしょうか。 ちょっと調べると -v:パターンに一致しなかった行を出力します。 A|B:AとBどちらかを含む というものが見つかったのですが、良く理解できませんでした。 どうぞよろしくお願い致します。

  • 正規表現で指定したURLに飛びたいのですが・・・・

    お世話になっております。 VB2005ユーザーです。 こちらで回答をいただくみなさんには頭が下がる思いでいっぱいです。 もう少々、お力をお貸しいただけませんか。 宜しくお願いいたします。 当方、環境はVB2005です。 WebBrowserにて、HTMLを操作していくプログラムに挑戦しています。 ある特定の文字列のリンクに飛ぶには、正規表現を使用し、URLを抽出するというところまでわかったのですが、 この正規表現の部分をwindowsフォーム内のテキストボックスの文字列にするにはどのようにしたらよいでしょうか? 以下は当方がチャレンジしましたが、無理だったパターンです。 Dim r As Regex = New Regex( _ "<a\s+[^>]*href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>[^\s>]+))[^>]*\s*.*" + TextBox1.text, _ RegexOptions.IgnoreCase Or RegexOptions.Compiled) Dim m As Match = r.Match(.Document.Body.InnerHtml) Dim St As String = m.Groups(1).Value '拾ってきたコード .Navigate(St) ・・・というようにしました。 上記の「+ TextBox1.text」の部分にテキストボックス内の文字列を挿入したいのです。 「+ TextBox1.text」の箇所を「TextBox1.text"」とすれば「TextBox1.text」自体を探してしまいますし・・・。 ちょっと行き詰ってしまいまして。 ご教授いただければ幸いでございます。 宜しくお願いいたします!!

  • 正規表現で「10以上」を指定したいです。

    正規表現について教えてください。 「10以上」という指定をしたいのですが [01]?[0-9][0-9]とすると00~199となって良いのですが 10もはいってしまいます。 「10以上」という考え方が良いのか「11から」と考えた方が良いのかもわかりません。 数字が二個以上という指定をすると 9.5なども含まれてしまいましたので なんとか「10以上」または「11から」の指定ができないでしょうか。 ちなみに上限は999です。 お願いします。

専門家に質問してみよう