Python正则替换问题:替换首尾为a且无内部a的单词中间字符为!
问题描述
需要实现:将首尾为a且内部不包含a的单词中,除首尾字符外的每个字符替换为!。
原Python代码:
import re txt = 'aba accca azzza wwwwa accca wwasdwaww abmasedmwa' regex = re.sub(r'\ba([^a]+)a\b', r'!\1!', txt) print(regex)
当前输出:
!b! !ccc! !zzz! wwwwa !ccc! wwasdwaww abmasedmwa
期望输出:
a!a a!!!a a!!!a wwwwa a!!!a wwasdwaww abmasedmwa
解决方案
原代码的问题在于替换表达式r'!\1!'错误地将匹配到的单词首尾的a也替换成了!,而我们需要保留首尾的a,仅替换中间字符。
修正后的代码可以通过回调函数生成符合要求的替换内容:
import re txt = 'aba accca azzza wwwwa accca wwasdwaww abmasedmwa' def replace_middle_chars(match): # 获取匹配到的中间非a字符组 middle_content = match.group(1) # 生成等长的!字符串,拼接首尾a return f'a{"!" * len(middle_content)}a' result = re.sub(r'\ba([^a]+)a\b', replace_middle_chars, txt) print(result)
也可以用lambda函数简化写法:
import re txt = 'aba accca azzza wwwwa accca wwasdwaww abmasedmwa' result = re.sub(r'\ba([^a]+)a\b', lambda m: f'a{"!"*len(m.group(1))}a', txt) print(result)
代码说明
- 正则表达式
r'\ba([^a]+)a\b'逻辑正确:匹配首尾为a、中间不含a的完整单词,([^a]+)捕获中间的非a字符组。 - 回调函数(或lambda)通过
match.group(1)获取中间内容,生成与该内容长度一致的!字符串,再拼接首尾的a,最终得到符合期望的结果。
内容的提问来源于stack exchange,提问作者enarvi
相关产品推荐
相关产品推荐

