仅在彼此直接相邻的大写字母之间插入空格[关闭]
Posted
技术标签:
【中文标题】仅在彼此直接相邻的大写字母之间插入空格[关闭]【英文标题】:inserting spaces inbetween only capital letters that are directly adjacent to each other [closed] 【发布时间】:2022-01-10 07:51:31 【问题描述】:我的目标是在各种缩写的字母之间添加空格。
缩写的三个条件:
-
缩写至少包含两个或多个字母。
缩写总是大写。
特殊字符“/”被认为是大写字母
想想 DNS、IP、TCP/IP 等。
我想对它们进行文本处理以变成:
D N S
I P
T C P / I P
等等。 假设我有这句话
因为 IP 提供了这种基本的路由功能,所以经常使用术语“IP 路由器”。路由器的其他旧术语是(IP 网关)、[Internet 网关] 和“网关”。 TCP/IP 12345。
运行这个命令有点解决我的问题:sed -e "s/[a-z \, \. \' \“ \” \( \) 0-9]*/& /g" -e "s/ */ /g" test.txt
它不是很完美。
我明白了:
因为IP提供了这个基本的路由功能,所以经常使用术语“IP路由器”。路由器的其他旧术语是(IP 网关)、[Internet 网关] 和“网关”。 T C P / I P 12345。
" 和 I P 之间还有一个空格。
( 和 I P 之间有一个空格。
[ 和 Internet 之间也有一个空格。
使用$ sed -e "s/[a-z \, \. \' \“ \” \( \) \[ \] 0-9]*/& /g" -e "s/ */ /g" test.txt
转义 [ 和 ] 不起作用,如下所示。
因为 IP 提供了这种基本的路由功能,所以经常使用术语“IP 路由器”。路由器的其他旧术语是(IP 网关)、[Internet 网关] 和“网关”。 TCP/IP 12345。
【问题讨论】:
@CarySwoveland 唯一适用的特殊规则是“/”是唯一应该被视为大写字母的特殊字符。其他特殊字符不适用。 【参考方案1】:正则表达式
/([A-Z])([A-Z])/
将匹配两个相邻的大写字母的实例。然后,您需要在替换中使用捕获组来获取相同的字母,它们之间有一个空格。
/\1 \2/
这只会连续捕获前两个大写字母,因此第一次迭代后的输出如下所示:
Think of D NS, I P, T CP/I P, etc.
因此,您需要重复替换,直到正则表达式不匹配。在 Python 中,这将是:
the_string = 'Think of DNS, IP, TCP/IP, etc.'
while re.search(r'([A-Z])([A-Z])', the_string):
the_string = re.sub(r'([A-Z])([A-Z])', r'\1 \2', the_string)
the_string
现在结束为:
Think of D NS, I P, T CP/I P, etc.
【讨论】:
【参考方案2】:使用 GNU sed 和条件跳转:
echo 'think of DNS, IP, TCP/IP, etc.' | sed -E ':x; s/([A-Z/])([A-Z/])/\1 \2/; tx'
输出:
想想 D N S、I P、T C P / I P 等。【讨论】:
以上是关于仅在彼此直接相邻的大写字母之间插入空格[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
将字符串格式化为仅在 python 中的单词之间有 n 个空格
Winforms 文本框允许用户只输入字母、数字、点和单词之间的空格。正则表达式