python全形和半形之間的轉換

2021-07-12 04:40:03 字數 2940 閱讀 5866

源檔案格式如下:

11387164	1994/m 年/q 7/m  /n 月/n ,/w 完成/v 第二/m 稿/ng

11387163	 /n 1992/m 年/q 底/f ,/w 在/p 妞妞/nr 死/v 後/f 一/m 年/q ,/w 我/r 把/p 自己/r 關/v 在/p 屋/n 裡/f ,/w 開始/v 寫/v 這/r 本/q 書/n ,/w 於/p 1993/m 年/q  /n 7/m 月/n 寫/v 出/v 初稿/n
目標去掉詞性標註

結果發現中間的空格沒去掉,最後發現原因是:全形的空格無法匹配

對應的編碼為:

發現前邊的空格是全形空格。

空格比較特殊,全形為12288(0x3000)

有規律(不含空格):

全形字符unicode編碼從65281~65374(十六進製制0xff01~0xff5e)

半形字元unicode編碼從33~126(十六進製制0x21~0x7e)

特例:空格比較特殊,全形為12288(0x3000),半形為32(0x20)

除空格外,全形/半形按unicode編碼排序在順序上是對應的(半形+0x7e=全形),所以可以直接通過用+-法來處理非空資料,對空格單獨處理。

def strq2b(ustring):

"""全形轉半形"""

rstring = ""

for uchar in ustring:

inside_code=ord(uchar)

if inside_code == 12288: #全形空格直接轉換

inside_code = 32

elif (inside_code >= 65281 and inside_code <= 65374): #全形字符(除空格)根據關係轉化

inside_code -= 65248

rstring += unichr(inside_code)

return rstring

def strb2q(ustring):

"""半形轉全形"""

rstring = ""

for uchar in ustring:

inside_code=ord(uchar)

if inside_code == 32: #半形空格直接轉化

inside_code = 12288

elif inside_code >= 32 and inside_code <= 126: #半形字元(除空格)根據關係轉化

inside_code += 65248

rstring += unichr(inside_code)

return rstring

程式**如下:

#encoding=utf8

#設定檔案的編碼

import sys

import codecs

import re

reload(sys)

sys.setdefaultencoding('utf-8')

print(sys.getdefaultencoding())

#讀檔案操作

#使用codec包進行檔案的讀取,在使用open()函式時指定編碼的型別:

text_file = codecs.open("liter_time.10", "r", encoding="gbk")

out_file = codecs.open("out.txt", "w", encoding="utf-8")

k = 0

def strq2b(ustring):

"""全形轉半形"""

rstring = ""

for uchar in ustring:

inside_code=ord(uchar)

if inside_code == 12288: #全形空格直接轉換

inside_code = 32

elif (inside_code >= 65281 and inside_code <= 65374): #全形字符(除空格)根據關係轉化

inside_code -= 65248

rstring += unichr(inside_code)

return rstring

for line in text_file:

line.strip()

# m_home=homeline.match(line)

# print(m_home.group())

line=strq2b(line)

print(line)

#去掉行首

line = re.sub("^[0-9]+\s*", "", line)

print(line)

#去掉/n詞性標註

line = re.sub("/\w*", "", line)

print(line)

#去掉空格

line = re.sub("\s*", "", line)

print(line)

line += "\n"

out_file.write(line.encode('utf-8'))

# break

k = k + 1

if( k > 5 ):

break

text_file.close()

out_file.close()

輸出結果:

全形轉半形 半形轉全形(Python)

coding utf 8 def str q2b u string 全形轉半形 全形字符unicode編碼從65281 65374 十六進製制 0xff01 0xff5e 半形字元unicode編碼從33 126 十六進製制 0x21 0x7e 空格比較特殊,全形為 12288 0x3000 半形為...

全形轉半形與半形轉全形

1.全形 指乙個字元占用兩個標準字元位置。漢字字元和規定了全形的英文本元及國標gb2312 80中的圖形符號和特殊字元都是全形字符。一般的系統命令是不用全形字符的,只是在作文書處理時才會使用全形字符。2.半形 指一字元占用乙個標準的字元位置。通常的英文本母 數字鍵 符號鍵都是半形的,半形的顯示內碼都...

python 全形轉半形

def strq2b ustring 全形轉半形 if not ustring return ustring rstring for uchar in ustring inside code ord uchar if inside code 12288 全形空格直接轉換 inside code 32...