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

Python如何仅删除紧邻单词的冒号而保留时间等数值旁的冒号

Python实现删除紧邻单词的冒号(保留数字旁冒号)

正则实现方法

你之前的正则匹配逻辑是对的,但没有拆分「单词」和「冒号」两个分组,直接替换会把单词一起删掉。调整正则为分组捕获单词部分,替换时仅保留单词即可:

import re

def remove_colon_around_words_regex(text):
    # 分组捕获冒号前后的单词,替换时只保留单词部分,丢弃冒号
    return re.sub(r':([A-Za-z_]\w*)|([A-Za-z_]\w*):', r'\1\2', text)

逻辑说明

  • 正则r':([A-Za-z_]\w*)'匹配「冒号+单词」结构,把单词部分捕获到分组1
  • 正则r'([A-Za-z_]\w*):'匹配「单词+冒号」结构,把单词部分捕获到分组2
  • 替换时用r'\1\2'拼接两个分组,自动丢弃未被捕获的冒号
  • 数字旁的冒号不会被匹配,所以会完整保留

非正则实现方法

逐字符遍历判断冒号的上下文,仅保留两侧都不是字母/下划线的冒号:

def remove_colon_around_words_plain(text):
    res = []
    n = len(text)
    for i, c in enumerate(text):
        if c != ':':
            res.append(c)
            continue
        # 遇到冒号,判断是否需要保留
        left_is_word = i > 0 and (text[i-1].isalpha() or text[i-1] == '_')
        right_is_word = i < n-1 and (text[i+1].isalpha() or text[i+1] == '_')
        # 只要冒号任意一侧是单词字符就删除,否则保留
        if not left_is_word and not right_is_word:
            res.append(c)
    return ''.join(res)

逻辑说明

  • 遍历每个字符,非冒号字符直接保留
  • 遇到冒号时判断左右字符:只要任意一侧是英文字母或下划线,就丢弃该冒号
  • 冒号两侧都是数字/符号(如时间格式)时,正常保留

测试验证

把示例输入代入测试即可得到预期结果:

test_input = """2018-05-21T00:00:00+02:00
00:00:00
00:00
:light at 07:15:0000

:occurence1
:occurence2

light: at 07:15:0000

occurence1:
occurence2:"""

# 两种方法输出完全一致,均符合预期
print(remove_colon_around_words_regex(test_input))
print(remove_colon_around_words_plain(test_input))

内容的提问来源于stack exchange,提问作者Naveen Reddy Marthala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 03:39:00