
Python實現全角半角字符互轉的方法
相信對于每一個編程人員來說,在文本處理的時候,經常會遇到全角半角不一致的問題。于是需要程序能夠快速的在兩者之間互轉。由于全角半角本身存在著映射關系,所以處理起來并不復雜。
具體規(guī)則為:
全角字符unicode編碼從65281~65374 (十六進制 0xFF01 ~ 0xFF5E)
半角字符unicode編碼從33~126 (十六進制 0x21~ 0x7E)
空格比較特殊,全角為 12288(0x3000),半角為 32(0x20)
而且除空格外,全角/半角按unicode編碼排序在順序上是對應的(半角 + 65248 = 全角)
所以可以直接通過用+-法來處理非空格數據,對空格單獨處理。
用到的一些函數
chr()函數用一個范圍在range(256)內的(就是0~255)整數作參數,返回一個對應的字符。
unichr()跟它一樣,只不過返回的是Unicode字符。
ord()函數是chr()函數或unichr()函數的配對函數,它以一個字符(長度為1的字符串)作為參數,返回對應的ASCII數值,或者Unicode數值。
先來打印下映射關系:
for i in xrange(33,127):
print i,chr(i),i+65248,unichr(i+65248)
返回結果
33 ! 65281 !
34 " 65282 "
35 # 65283 #
36 $ 65284 $
37 % 65285 %
38 & 65286 &
39 ' 65287 '
40 ( 65288 (
41 ) 65289 )
42 * 65290 *
43 + 65291 +
44 , 65292 ,
45 - 65293 -
46 . 65294 .
47 / 65295 /
48 0 65296 0
49 1 65297 1
50 2 65298 2
51 3 65299 3
52 4 65300 4
53 5 65301 5
54 6 65302 6
55 7 65303 7
56 8 65304 8
57 9 65305 9
58 : 65306 :
59 ; 65307 ;
60 < 65308 <
61 = 65309 =
62 > 65310 >
63 ? 65311 ?
64 @ 65312 @
65 A 65313 A
66 B 65314 B
67 C 65315 C
68 D 65316 D
69 E 65317 E
70 F 65318 F
71 G 65319 G
72 H 65320 H
73 I 65321 I
74 J 65322 J
75 K 65323 K
76 L 65324 L
77 M 65325 M
78 N 65326 N
79 O 65327 O
80 P 65328 P
81 Q 65329 Q
82 R 65330 R
83 S 65331 S
84 T 65332 T
85 U 65333 U
86 V 65334 V
87 W 65335 W
88 X 65336 X
89 Y 65337 Y
90 Z 65338 Z
91 [ 65339 [
92 \ 65340 \
93 ] 65341 ]
94 ^ 65342 ^
95 _ 65343 _
96 ` 65344 `
97 a 65345 a
98 b 65346 b
99 c 65347 c
100 d 65348 d
101 e 65349 e
102 f 65350 f
103 g 65351 g
104 h 65352 h
105 i 65353 i
106 j 65354 j
107 k 65355 k
108 l 65356 l
109 m 65357 m
110 n 65358 n
111 o 65359 o
112 p 65360 p
113 q 65361 q
114 r 65362 r
115 s 65363 s
116 t 65364 t
117 u 65365 u
118 v 65366 v
119 w 65367 w
120 x 65368 x
121 y 65369 y
122 z 65370 z
123 { 65371 {
124 | 65372 |
125 } 65373 }
126 ~ 65374 ~
把全角轉成半角:
def full2half(s):
n = []
s = s.decode('utf-8')
for char in s:
num = ord(char)
if num == 0x3000:
num = 32
elif 0xFF01 <= num <= 0xFF5E:
num -= 0xfee0
num = unichr(num)
n.append(num)
return ''.join(n)
把半角轉成全角:
def half2full(s):
n = []
s = s.decode('utf-8')
for char in s:
num = char(char)
if num == 320:
num = 0x3000
elif 0x21 <= num <= 0x7E:
num += 0xfee0
num = unichr(num)
n.append(num)
return ''.join(n)
上面的實現方式非常的簡單,但是現實情況下可能并不會把所以的字符統一進行轉換,比如中文文章中我們期望將所有出現的字母和數字全部轉化成半角,而常見標點符號統一使用全角,上面的轉化就不適合了。
解決方案,是自定義詞典。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
FH_SPACE = FHS = ((u" ", u" "),)
FH_NUM = FHN = (
(u"0", u"0"), (u"1", u"1"), (u"2", u"2"), (u"3", u"3"), (u"4", u"4"),
(u"5", u"5"), (u"6", u"6"), (u"7", u"7"), (u"8", u"8"), (u"9", u"9"),
)
FH_ALPHA = FHA = (
(u"a", u"a"), (u"b", u"b"), (u"c", u"c"), (u"d", u"d"), (u"e", u"e"),
(u"f", u"f"), (u"g", u"g"), (u"h", u"h"), (u"i", u"i"), (u"j", u"j"),
(u"k", u"k"), (u"l", u"l"), (u"m", u"m"), (u"n", u"n"), (u"o", u"o"),
(u"p", u"p"), (u"q", u"q"), (u"r", u"r"), (u"s", u"s"), (u"t", u"t"),
(u"u", u"u"), (u"v", u"v"), (u"w", u"w"), (u"x", u"x"), (u"y", u"y"), (u"z", u"z"),
(u"A", u"A"), (u"B", u"B"), (u"C", u"C"), (u"D", u"D"), (u"E", u"E"),
(u"F", u"F"), (u"G", u"G"), (u"H", u"H"), (u"I", u"I"), (u"J", u"J"),
(u"K", u"K"), (u"L", u"L"), (u"M", u"M"), (u"N", u"N"), (u"O", u"O"),
(u"P", u"P"), (u"Q", u"Q"), (u"R", u"R"), (u"S", u"S"), (u"T", u"T"),
(u"U", u"U"), (u"V", u"V"), (u"W", u"W"), (u"X", u"X"), (u"Y", u"Y"), (u"Z", u"Z"),
)
FH_PUNCTUATION = FHP = (
(u".", u"."), (u",", u","), (u"!", u"!"), (u"?", u"?"), (u"”", u'"'),
(u"'", u"'"), (u"‘", u"`"), (u"@", u"@"), (u"_", u"_"), (u":", u":"),
(u";", u";"), (u"#", u"#"), (u"$", u"$"), (u"%", u"%"), (u"&", u"&"),
(u"(", u"("), (u")", u")"), (u"‐", u"-"), (u"=", u"="), (u"*", u"*"),
(u"+", u"+"), (u"-", u"-"), (u"/", u"/"), (u"<", u"<"), (u">", u">"),
(u"[", u"["), (u"¥", u"\\"), (u"]", u"]"), (u"^", u"^"), (u"{", u"{"),
(u"|", u"|"), (u"}", u"}"), (u"~", u"~"),
)
FH_ASCII = HAC = lambda: ((fr, to) for m in (FH_ALPHA, FH_NUM, FH_PUNCTUATION) for fr, to in m)
HF_SPACE = HFS = ((u" ", u" "),)
HF_NUM = HFN = lambda: ((h, z) for z, h in FH_NUM)
HF_ALPHA = HFA = lambda: ((h, z) for z, h in FH_ALPHA)
HF_PUNCTUATION = HFP = lambda: ((h, z) for z, h in FH_PUNCTUATION)
HF_ASCII = ZAC = lambda: ((h, z) for z, h in FH_ASCII())
def convert(text, *maps, **ops):
""" 全角/半角轉換
args:
text: unicode string need to convert
maps: conversion maps
skip: skip out of character. In a tuple or string
return: converted unicode string
"""
if "skip" in ops:
skip = ops["skip"]
if isinstance(skip, basestring):
skip = tuple(skip)
def replace(text, fr, to):
return text if fr in skip else text.replace(fr, to)
else:
def replace(text, fr, to):
return text.replace(fr, to)
for m in maps:
if callable(m):
m = m()
elif isinstance(m, dict):
m = m.items()
for fr, to in m:
text = replace(text, fr, to)
return text
if __name__ == '__main__':
text = u"成田空港—【JR特急成田エクスプレス號?橫浜行,2站】—東京—【JR新幹線はやぶさ號?新青森行,6站 】—新青森—【JR特急スーパー白鳥號?函館行,4站 】—函館"
print convert(text, FH_ASCII, {u"【": u"[", u"】": u"]", u",": u",", u".": u"。", u"?": u"?", u"!": u"!"}, spit=",。?!“”")
特別注意:引號在英語體系中引號是不區(qū)分前引號和后引號。
總結
以上就是關于Python實現全角半角字符互轉的方法,希望本文的內容對大家的學習或者工作能帶來一定的幫助
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數的日期轉換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數據處理中,日期格式轉換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數據庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數據分析師:表結構數據 “獲取 - 加工 - 使用” 全流程的賦能者 表結構數據(如數據庫表、Excel 表、CSV 文件)是企業(yè)數字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數據分析師:解鎖表結構數據特征價值的專業(yè)核心 表結構數據(以 “行 - 列” 規(guī)范存儲的結構化數據,如數據庫表、Excel 表、 ...
2025-09-17Excel 導入數據含缺失值?詳解 dropna 函數的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數據時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數據分析與統計學領域,假設檢驗是驗證研究假設、判斷數據差異是否 “ ...
2025-09-16CDA 數據分析師:掌控表格結構數據全功能周期的專業(yè)操盤手 表格結構數據(以 “行 - 列” 存儲的結構化數據,如 Excel 表、數據 ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數據分析師:激活表格結構數據價值的核心操盤手 表格結構數據(如 Excel 表格、數據庫表)是企業(yè)最基礎、最核心的數據形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調用、數據爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數據的科學計數法問題 為幫助 Python 數據從業(yè)者解決pd.read_csv讀取長浮點數據時的科學計數法問題 ...
2025-09-12CDA 數據分析師:業(yè)務數據分析步驟的落地者與價值優(yōu)化者 業(yè)務數據分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數據把關的實戰(zhàn)指南 在業(yè)務系統落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數據驅動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數據分析師與戰(zhàn)略 / 業(yè)務數據分析:概念辨析與協同價值 在數據驅動決策的體系中,“戰(zhàn)略數據分析”“業(yè)務數據分析” 是企業(yè) ...
2025-09-11Excel 數據聚類分析:從操作實踐到業(yè)務價值挖掘 在數據分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數據中挖 ...
2025-09-10統計模型的核心目的:從數據解讀到決策支撐的價值導向 統計模型作為數據分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10