You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换模式M)与N)之间除首个空格外的所有空格?

搞定这个需求很简单!核心是精准定位M)到}N)的区间,然后只保留区间内的第一个空格,移除其余所有空格。下面给你几个常用工具的实现方案:

输入与预期效果

输入示例:

LINE1 LINE1 M) W1 W2 W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1 Z2 Z3 Z4}N) REST

预期输出:

LINE1 LINE1 M) W1W2W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1Z2Z3Z4}N) REST

Python 实现

用Python的re.sub配合回调函数,能灵活处理区间内的替换逻辑:

import re

input_text = """LINE1 LINE1 M) W1 W2 W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1 Z2 Z3 Z4}N) REST"""

def clean_spaces_in_range(match):
    # 拆分匹配到的内容:M) + 第一个空格 + 后续内容 + }N)
    prefix = match.group(1)
    first_space = match.group(2)
    content = match.group(3)
    suffix = match.group(4)
    # 移除后续内容里的所有空格
    cleaned_content = content.replace(" ", "")
    # 拼接成最终结果
    return f"{prefix}{first_space}{cleaned_content}{suffix}"

# 正则匹配M)到}N)的完整区间,捕获关键部分
result = re.sub(r'(M))(\s)(.*?)(}N)', clean_spaces_in_range, input_text)
print(result)

逻辑说明:正则精准捕获M)、第一个空格、区间内的内容和}N),回调函数只清理区间内容里的所有空格,保留M)后的第一个空格。


Perl 实现

Perl的正则支持/e修饰符,允许替换部分直接写表达式,代码更简洁:

my $input_text = "LINE1 LINE1 M) W1 W2 W3}N) REST LINE2 LINE2 SOME OTHER WORDS LINE3 LINE3 LINE3 M) Z1 Z2 Z3 Z4}N) REST";
$input_text =~ s/(M))(\s)(.*?)(}N)/$1$2 . $3 =~ s/ //gr . $4/ge;
print "$input_text\n";

逻辑说明:$3 =~ s/ //gr会把区间内的内容(W1 W2 W3这类)的空格全部移除,/e让Perl执行这个替换表达式,再拼接回原结构。


Sed 实现(GNU Sed)

如果用Shell环境的sed,可以通过循环替换来实现:

sed -E ':loop
s/(M)[^}]* )([^ ]*) /\1\2/g
t loop' input.txt

逻辑说明:定义一个循环标签:loop,每次替换M)之后、}N)之前的空格(除了第一个),直到没有可替换的空格为止,t loop表示替换成功就回到循环开头继续处理。

内容的提问来源于stack exchange,提问作者DonJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:28:00