去除中英文夾雜的空白
這篇文章會介紹使用 Python 的正規表達式 re,實做「去除中英文夾雜的空白」實際應用,」,讓一段中英文夾雜的句子中,只去除中文字之間的空白,保留英文單字之間的空白。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
去除空白的規則
在一些中英文夾雜的寫作規範裡,往往會強調中文英文和標點符號的寫作規範,這篇教學所採用的規範如下:
- 中文字和英文字中間要有空白。
- 除了括號外,其他標點符號使用「全形標點符號」。
- 括號左右需要有空白,括號和括號之間不留空白。
- 全形標點符號左右不留空白。
步驟 1,在所有的中文字中間加上空白
為了避免一些額外的狀況,所以在去除空白之前,先將所有中文字加上空白,使用的正規表達式說明如下:
匹配 | 說明 |
---|---|
\u4E00-\u9FFF |
所有中文字。 |
\uFF00-\uFFFF |
所有全形標點符號。 |
\u0021-\u002F |
所有半形標點符號。 |
\n |
結尾換行。 |
a-zA-Z0-9 |
所有英文字母和阿拉伯數字。 |
執行下方程式,就可以將原本的文字中間全部加上空格,並且移除部分太多的空白。
參考:使用正規表達式 re、合併串列
import re
# 要轉換的字串
text = '''請 求 您 幫 我 oxxo.studio 去 除 空 白 ok ?
但是要保留換行 可以 嗎 ,( 哈哈哈 )( 啊哈)
統一便利超商 (711) 的括號之間也要有空白喔!
寫作規 範就是這 麼 100% 的龜毛~
'''
# 取得中文字和英文單字的正規表達式
# [a-zA-Z0-9]+ 表示開頭是英文字母後面連接一串字母或數字
regex= re.compile(r'[\u4E00-\u9FFF\uFF00-\uFFFF\u0021-\u002F\n]|[a-zA-Z0-9]+')
# 根據正規表達式,將每個中文字、標點符號和英文單字變成串列
arr = re.findall(regex, text)
# 使用空格合併串列
text = ' '.join(arr)
print(text)
'''
請 求 您 幫 我 oxxo . studio 去 除 空 白 ok ?
但 是 要 保 留 換 行 可 以 嗎 , ( 哈 哈 哈 ) ( 啊 哈 )
統 一 便 利 超 商 ( 711 ) 的 括 號 之 間 也 要 有 空 白 喔 !
寫 作 規 範 就 是 這 麼 100 % 的 龜 毛 ~
'''
步驟 2,根據規則移除空白
首先根據條件取出空白 ( \x20
),空白必須夾在「英文大小寫字母、數字、標點符號之間」( [^a-zA-Z0-9\u0021-\u002E]
),取出後將其取代並移除。
regex= re.compile(r'(?<=[^a-zA-Z0-9\u0021-\u002E])(\x20)(?=[^a-zA-Z0-9\u0021-\u002E])')
text = re.sub(regex, '', text)
print(text)
'''
請求您幫我 oxxo . studio 去除空白 ok ?
但是要保留換行可以嗎, ( 哈哈哈 ) ( 啊哈 )
統一便利超商 ( 711 ) 的括號之間也要有空白喔!
寫作規範就是這麼 100 % 的龜毛~
'''
移除後,繼續處理一些括號和百分比符號的細節,將後方有「右括號、百分比符號和全形標點符號」( [\(\%\uFF00-\uFFFF]
) 的空白移除。
regex= re.compile(r'(\x20)(?=[\(\%\uFF00-\uFFFF])')
text = re.sub(regex, '', text)
print(text)
'''
請求您幫我 oxxo . studio 去除空白 ok?
但是要保留換行可以嗎,( 哈哈哈 )( 啊哈 )
統一便利超商( 711 ) 的括號之間也要有空白喔!
寫作規範就是這麼 100% 的龜毛~
'''
步驟 3,最後修飾
如果移除空白後還有一些地方需要調整,例如 oxxo 和 studio 中間的「.」不用空白,就可以單純針對這些細節作調整。
text = text.replace(' . ','.')
print(text)
'''
請求您幫我 oxxo.studio 去除空白 ok?
但是要保留換行可以嗎,( 哈哈哈 )( 啊哈 )
統一便利超商( 711 ) 的括號之間也要有空白喔!
寫作規範就是這麼 100% 的龜毛~
'''
完整程式碼
下方列出去除中英文夾雜的空白的完整程式碼:
import re
# 輸入字符串
text = '''請 求 您 幫 我 oxxo.studio 去 除 空 白 ok ?
但是要保留換行 可以 嗎 ,( 哈哈哈 )( 啊哈)
統一便利超商 (711) 的括號之間也要有空白喔!
寫作規 範就是這 麼 100% 的龜毛~
'''
regex= re.compile(r'[\u4E00-\u9FFF\uFF00-\uFFFF\u0021-\u002F\n]|[a-zA-Z0-9]+')
arr = re.findall(regex, text)
text = ' '.join(arr)
regex= re.compile(r'(?<=[^a-zA-Z0-9\u0021-\u002E])(\x20)(?=[^a-zA-Z0-9\u0021-\u002E])')
text = re.sub(regex, '', text)
regex= re.compile(r'(\x20)(?=[\(\%\uFF00-\uFFFF])')
text = re.sub(regex, '', text)
text = text.replace(' . ','.')
print(text)
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~