正则 | 增删单双字节字符间的空格
英文字母属于单字节字符,而汉字及中文标点符号则属于双字节字符。
增删单双字节字符间以及双字节字符间的空格是一个常见的操作。人工执行较为繁琐,还易出错。用正则表达式可以快速、准确地实现这一目标。
删除中文(及标点符号)与中文(及标点符号)间的空格,并在中文(及标点符号)与英文及阿拉伯数字间添加空格
字符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))