正则 | 增删单双字节字符间的空格


Posted on Feb 01, 2023 by 辑舟君 1778 words views

英文字母属于单字节字符,而汉字及中文标点符号则属于双字节字符。

增删单双字节字符间以及双字节字符间的空格是一个常见的操作。人工执行较为繁琐,还易出错。用正则表达式可以快速、准确地实现这一目标。

删除中文(及标点符号)与中文(及标点符号)间的空格,并在中文(及标点符号)与英文及阿拉伯数字间添加空格

字符1 字符2 空格 正则匹配式 正则替换式
中文汉字 英文字母 ([一-龻])([a-zA-Z]) \1 \2
([a-zA-Z])([一-龻]) 同上 与前一行同时执行
数字 ([一-龻]) +(\d) \1 \2
(\d)([一-龻]) 同上 与前一行同时执行
英文标点 ([一-龻])(["#$'()+,./:;?{}~©«» ! % &*=@^ _  ¦§® ° ±  · º × ÷ ‒ ‘ ’ †`<>•… ‰′ ›‹ ※ –—‖‐“”‡″‴−[]\-]) \1 \2
(["#$'()+,./:;?{}~©«» ! % &*=@^ _  ¦§® ° ±  · º × ÷ ‒ ‘ ’ †`<>•… ‰′ ›‹ ※ –—‖‐“”‡″‴−[]\-])([一-龻]) 同上
数字 英文字母 (\d)([a-zA-Z]) \1 \2 谨慎使用
([a-zA-Z])(\d) 同上 与前一行同时执行
数字 (\d)(\d) \1 \2 谨慎使用
英文标点 (\d) +(["#$'()+,./:;?{}~©«» ! % &*=@^ _  ¦§® ° ±  · º × ÷ ‒ ‘ ’ †`<>•… ‰′ ›‹ ※ –—‖‐“”‡″‴−[]\-]) \1\2
(["#$'()+,./:;?{}~©«» ! % &*=@^ _  ¦§® ° ±  · º × ÷ ‒ ‘ ’ †`<>•… ‰′ ›‹ ※ –—‖‐“”‡″‴−[]\-]) +(\d) 同上
中文标点 英文字母 ([!-○、-〾]) +([a-zA-Z]) \1\2
([a-zA-Z]) +([!-○、-〾]) 同上 与前一行同时执行
数字 ([!-○、-〾]) +(\d) \1\2
(\d) +([!-○、-〾]) 同上 与前一行同时执行
英文标点 ([!-○、-〾]) +(["#$'()+,./:;?{}~©«» ! % &*=@^ _  ¦§® ° ±  · º × ÷ ‒ ‘ ’ †`<>•… ‰′ ›‹ ※ –—‖‐“”‡″‴−[]\-]) \1\2
(["#$'()+,./:;?{}~©«» ! % &*=@^ _  ¦§® ° ±  · º × ÷ ‒ ‘ ’ †`<>•… ‰′ ›‹ ※ –—‖‐“”‡″‴−[]\-]) +([!-○、-〾]) 同上
中文汉字 中文汉字 ([一-龻]) +([一-龻]) \1\2
中文汉字 中文标点 ([一-龻]) +([!-○、-〾]) \1\2
([!-○、-〾]) +([一-龻]) 同上 与前一行同时执行
中文标点 中文标点 ([!-○、-〾]) +([!-○、-〾]) \1\2
双字节字符 单字节字符 ([一-龻!-○、-〾]) +([^一-龻!-○、-〾\t\r\n\v\f ]) \1\2
([^一-龻!-○、-〾\t\r\n\v\f ]) +([一-龻!-○、-〾]) 同上 与前一行同时执行
注:基本正则
中文汉字 [一-龻]
中文标点 [!-○、-〾]
英文字母 [a-zA-Z]
英文标点 ["#$’()+,-./:;?{}~©«» ! " # % & ’ ( * + - . / : ; = ? @  ^ _ 
数字 \d
中文汉字+中文标点 [一-龻!-○、-〾]
英文字母+英文标点+数字 [^一-龻!-○、-〾\t\r\n\v\f]
英文字母+英文标点+数字 [a-z_A-Z0-9"#$’()+,-./:;?{}~©«» ! " # % & ’ ( * + - . / : ; = ? @  ^ _ 
上述二者基本等价
双字节字符 [一-龻!-○、-〾]
单字节字符 [^一-龻!-○、-〾\t\r\n\v\f]

应用举例

import re
string = "特斯拉' Model 3 是一款高性能  电动汽车。 Model 3 Plus 是上一款车型M3 2X+的 1个<升级版>pro.1,2!5G网^络全覆/盖车身。(TBD)值得期待!! ! 。"
def adjust_space(string):
    string = re.sub("([一-龻!-○、-〾]) +([一-龻!-○、-〾])", r"\1\2", string) # To remove spaces between CN chars (and CN punctuations)
    string = re.sub("([!-○、-〾]) +([^一-龻!-○、-〾\t\r\n\v\f])", r"\1\2", string) # To remove spaces between CN punctuations and EN chars
    string = re.sub("([^一-龻!-○、-〾\t\r\n\v\f]) +([!-○、-〾])", r"\1\2", string) # To remove spaces between CN punctuations and EN chars
    string = re.sub("([一-龻])([^一-龻!-○、-〾\t\r\n\v\f ])", r"\1 \2", string) # To add a space between CN and EN chars
    string = re.sub("([^一-龻!-○、-〾\t\r\n\v\f ])([一-龻])", r"\1 \2", string) # To add a space between EN and CN chars
    return string
print(adjust_space(string))