【问题标题】:inserting spaces inbetween only capital letters that are directly adjacent to each other [closed]仅在彼此直接相邻的大写字母之间插入空格[关闭]
【发布时间】:2022-01-10 07:51:31
【问题描述】:

我的目标是在各种缩写的字母之间添加空格。

缩写的三个条件:

  1. 缩写至少包含两个或多个字母。
  2. 缩写总是大写。
  3. 特殊字符“/”被认为是大写字母

想想 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 唯一适用的特殊规则是“/”是唯一应该被视为大写字母的特殊字符。其他特殊字符不适用。

标签: regex awk text sed


【解决方案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 等。

    【讨论】:

      猜你喜欢
      • 2019-10-14
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多