Pythonにおける文字列処理の質問です。


半角全角が混ざった文字があった時に、
半角文字列であればそのまま、
全角文字が混じっていれば、NULLに置換して戻す処理を行いたいと思うのですが、
一番簡単な方法を教えて下さい。
関数にして紹介いただければうれしいです。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/02/21 23:42:49
  • 終了:2013/02/22 06:43:17

ベストアンサー

id:mjy No.2

mjy回答回数67ベストアンサー獲得回数202013/02/22 01:59:34

ポイント100pt

http://docs.python.jp/2/library/unicodedata.html?highlight=east_asian_width#unicodedata.east_asian_width
http://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85

#! /usr/bin/python2
#coding: utf-8

import unicodedata

def is_halfwidth(unicode_char):
    w = unicodedata.east_asian_width(unicode_char)
    if w=='Na' or w=='N' or w=='H':
        return True
    else:
        return False


def del_fullwidth(unicode_string):
    result = []
    for s in unicode_string:
        if is_halfwidth(s):
            result.append(s)
        #本当に削除でなく、Null文字にしたいならば以下を有効に
        #else:
        #    result.append('\0')
    return u''.join(result)


if __name__ == '__main__':
    print(del_fullwidth(u'あいう-abc-アイウ-123'))

その他の回答(1件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492013/02/22 01:05:12

ポイント100pt

標準装備のunicodedataを使ってみました。
Noneだと何も返さないので空文字列を返すようにしてます。

# -*- coding: utf-8 -*-
import unicodedata
def zenkaku(s):
  for s1 in s:
    if unicodedata.east_asian_width(s1) != 'Na':
      s = ''
      break
  return s

s = u'aあa'
print zenkaku(s)
s = u'aba'
print zenkaku(s)
id:windofjuly

正規表現でせめてくる回答もきそうな予感がするのでオマケ。

正規表現で総当り。
http://winter-tail.sakura.ne.jp/pukiwiki/index.php?Python%A4%A2%A4%EC%A4%B3%A4%EC%2F%C0%B5%B5%AC%C9%BD%B8%BD%A5%D1%A5%BF%A1%BC%A5%F3

正規表現で全角の文字コード範囲で探る。
http://programmer-toy-box.sblo.jp/article/18461430.html

マルチバイト対応だけであればord関数のほうが楽?
やっぱり応用力でeast_asian_widthか…ちょっと悩む。
http://www.programming-magic.com/20081024005708/

2013/02/22 02:08:30
id:mjy No.2

mjy回答回数67ベストアンサー獲得回数202013/02/22 01:59:34ここでベストアンサー

ポイント100pt

http://docs.python.jp/2/library/unicodedata.html?highlight=east_asian_width#unicodedata.east_asian_width
http://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6%96%87%E5%AD%97%E5%B9%85

#! /usr/bin/python2
#coding: utf-8

import unicodedata

def is_halfwidth(unicode_char):
    w = unicodedata.east_asian_width(unicode_char)
    if w=='Na' or w=='N' or w=='H':
        return True
    else:
        return False


def del_fullwidth(unicode_string):
    result = []
    for s in unicode_string:
        if is_halfwidth(s):
            result.append(s)
        #本当に削除でなく、Null文字にしたいならば以下を有効に
        #else:
        #    result.append('\0')
    return u''.join(result)


if __name__ == '__main__':
    print(del_fullwidth(u'あいう-abc-アイウ-123'))
  • id:windofjuly
    うぃんど 2013/02/22 02:31:57
    回答1 windofjulyの解釈
    (変数Sの内容が)半角文字列(半角カナなどは含まない)であればそのまま、
    全角文字が混じっていれば、(変数Sを)NULLに置換して戻す処理を行いたいと思うのですが、

    回答2 mjyさんの解釈
    (変数Sの内容が)半角文字列(半角カナなどを含む)であればそのまま、
    全角文字が混じっていれば、(全角文字を)NULLに置換して戻す処理を行いたいと思うのですが、
    さて、どの組み合わせが正しいの?
  • id:masakiplus
    すいません。今回欲しかったのは後者になります。言葉足らずで失礼しました。
  • id:windofjuly
    うぃんど 2013/02/22 06:58:23
    こちらこそ推敲力が低くてすみません。

    mjyさんの書き込みで別解釈に気づくほど…重ね重ね失礼しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません