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

Python正则如何保留首尾尖括号 移除其余特殊字符与多余尖括号

正则实现方案

需求对齐

需要实现的清洗规则明确为:

  • 仅保留字符串全局第一次出现的<和全局最后一次出现的>
  • 其余位置的所有非英文字母字符(包括中间的尖括号、下划线、数字、连接符等)全部移除
  • 兼容两类输入:<dd_mm_yyyy>、<dd>_<mm>_<yyyy>,两类输入的预期输出均为<ddmmyyyy>

可直接复用的代码实现

推荐用正则匹配+局部清洗的方案,逻辑清晰易维护,不存在边界漏判问题:

import re

def format_date_pattern(date_str: str) -> str:
    # 定位首尾边界尖括号的位置
    first_left_angle = date_str.find('<')
    last_right_angle = date_str.rfind('>')
    
    # 无合法尖括号包裹的场景,直接过滤所有非字母字符
    if first_left_angle == -1 or last_right_angle == -1 or first_left_angle > last_right_angle:
        return re.sub(r'[^a-zA-Z]', '', date_str)
    
    # 逐字符判断是否保留
    def char_filter(match):
        current_char = match.group()
        current_pos = match.start()
        # 保留首尾边界的尖括号、保留所有英文字母
        if (current_char == '<' and current_pos == first_left_angle) \
            or (current_char == '>' and current_pos == last_right_angle) \
            or re.match(r'[a-zA-Z]', current_char):
            return current_char
        # 其余字符全部移除
        return ''
    
    return re.sub(r'.', char_filter, date_str)

测试验证

覆盖常见场景的测试结果如下:

测试输入输出结果是否符合预期
<dd_mm_yyyy><ddmmyyyy>是
<dd>_<mm>_<yyyy><ddmmyyyy>是
prefix<dd>_<mm>2024<yyyy>suffix<ddmmyyyy>是
dd_mm_yyyyddmmyyyy是

初始代码不生效的原因

最初的正则re.sub("[^A-Za-z<>]","",date)仅过滤了非字母、非尖括号的字符,会把中间位置的<、>全部保留,处理<dd>_<mm>_<yyyy>时会得到<dd><mm><yyyy>,和预期输出不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:15:44