![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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文のみなので、別で行が追加される分にはかまいません。)
よろしくお願いします。
No.2
- 回答日時:
せっかくなので、正規表現について勉強しましょう。
正規表現 HOWTO
http://docs.python.jp/2/howto/regex.html
7.2. re — 正規表現操作
http://docs.python.jp/2.7/library/re.html
\bについては、2つの罠にハマっています。
一つは、上記HOWTOにもあるものです
http://docs.python.jp/2/howto/regex.html#more-me …
> \b
> 単語の境界。(略)
> この特別なシーケンスを利用するときには二つの微妙な点を心にとめておく必要があります。
> まずひとつめは Python の文字列リテラルと表現の間の最悪の衝突を引き起すことです。
> Python の文字列リテラルでは \b は ASCII 値8のバックスペース文字です。
> raw string を利用していない場合、Python は \b をバックスペースに変換し、正規表現は期待するものとマッチしなくなります。
もう一つは、reモジュールの説明の方にあります。
> \b
> 空文字列とマッチしますが、単語の先頭か末尾の時だけです。
> 単語は英数字あるいは下線文字の並んだものとして定義されています (略)
> 英数字であると見なされる文字の正確な集合は、 UNICODE と LOCALE フラグの値に依存することに注意して下さい。
つまり、現状は、ひらがなは「単語の一部ではない」と見做されている状態です。
対策としては
・UNICODEフラグONでcompileしたreのオブジェクトを使う。
コンパイル済みの正規表現オブジェクトの使い方はHOWTOにも書いてあります。
forの外でcompileすると、forの中では、毎回正規表現をコンパイルする必要が無くなり、効率の向上が期待できます。
・(?u)で、UNICODEフラグを設定する
> (?iLmsux)
> ( 集合 'i', 'L', 'm', 's', 'u', 'x' から1文字以上) 。
> 文字は、正規表現全体の対応するフラグ (re.I (大文字・小文字を区別しない), re.L (ロケール依存), re.M (MULTILINEモード), re.S (DOTALLモード), re.U (Unicode依存), re.X (冗長) ) を設定します。
あと、\s だと 無理 ぃ お 暮らし ホーミング の「お」にマッチしません。
「お」の前の空白が、「ぃ」の後の空白としてマッチしてしまうため、続きが「お」からになるからです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) Microsoft IME 一発で変換できない言葉がある 3 2022/07/19 19:29
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- 英語 ソシュール言語観による品詞、単語、辞書理解の誤り 4 2022/11/24 12:27
- 日本語 自立語/付属語という品詞区分の誤り 5 2022/09/05 00:20
- 大学受験 京都橘大学C日程なのですが残り2週間で英語2割あげるのは現実的ではありませんか? 過去問ではずっと5 2 2023/01/27 17:31
- 中学校 間違った国語の実力テストの勉強? 1 2022/08/28 15:59
- 英語 「再び」の接頭辞”re-"を有する単語と文末に"again"を付けた表現のニュアンスに違いについて 1 2022/12/13 12:40
- スタンプ・絵文字・顔文字 前回質問の続き 1 2022/08/24 16:06
- 英語 A healthy 20 centimeters tall の a がなぜ定冠詞でないのでしょうか? 2 2022/10/14 05:21
- 英語 A healthy 20 centimeters tall の a がなぜ定冠詞でないのでしょうか? 2 2022/10/22 04:40
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
正規表現で囲まれた部分の文字列
-
正規表現についてすっかり忘れ...
-
(秀丸)正規表現で、特定文字列...
-
正規表現です。括弧内にある複...
-
【3桁の数字】に【完全一致】す...
-
PS4コントローラーをPCでゲーム...
-
wordの何も書かれていない2ペー...
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
Chr(13)とChr(10)の違いは?
-
EBCDIC⇒SJIS変換の方法
-
CASLⅡ 文字データから数値デー...
-
1文字って1バイトだったっけ?
-
Excelで指数表現しないようにす...
-
VBAでの Replace関数で、ワイル...
-
Excelで3E8を3.00E+8にしない方...
-
Accessにインポートしようとす...
-
std::stringからLPCWSTR型への変換
-
プログラムについての質問です...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
vbaの正規表現で、マッチした一...
-
メールアドレスの正規表現について
-
[VBS] テキストファイルから任...
-
正規表現でシングルクォーテー...
-
文章中全ての半角カッコ ( の...
-
MFCで正規表現
-
[正規表現] 数字範囲をヒット...
-
Mで始まりuで終わる文字列
-
正規表現でAND検索はできる...
-
C言語にパターンマッチってない...
-
正規表現で囲まれた部分の文字列
-
正規表現です。括弧内にある複...
-
さくらエディタでGrep検索する...
-
文字列検索(grepのようなもの)...
-
正規表現で、青空文庫形式の入...
-
正規表現で一致しない(否定)場...
-
C言語のコメントを「正規表現」...
-
正規表現でカウントアップ(?)す...
-
正規表現で特定文字列の全角カ...
おすすめ情報