去除中英文夹杂的空白
这篇文章会介绍使用 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)
微信扫码关注
抖音扫码关注