仅在彼此直接相邻的大写字母之间插入空格[关闭]

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 文本框允许用户只输入字母、数字、点和单词之间的空格。正则表达式

python使用正则表达式识别大写字母并在大写字母前插入空格

将用逗号/空格分隔的名称插入到通过 jQuery 创建的 <li> 中