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_yyyy | ddmmyyyy | 是 |
初始代码不生效的原因
最初的正则re.sub("[^A-Za-z<>]","",date)仅过滤了非字母、非尖括号的字符,会把中间位置的<、>全部保留,处理<dd>_<mm>_<yyyy>时会得到<dd><mm><yyyy>,和预期输出不符。
内容的提问来源于stack exchange,提问作者vai_007
相关产品推荐
相关产品推荐

