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
相关产品推荐
相关产品推荐

