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

Python正则表达式报错:nothing to repeat at position 0 求助

解决字符串审查还原问题的正则错误

需求

给定被审查的字符串(用*替换元音)和对应的元音字符串,还原出原始未审查的字符串。例如调用uncensor("Wh*r* d*d my v*w*ls g*", "eeioeo")应返回"Where did my vowels go"。

原代码及错误

用户编写的代码:

import re

def uncensor(string1, string2):
  # Use a regular expression to find all the asterisks in string1
  asterisks = re.findall(r'\*?', string1)

  # Replace each asterisk with the corresponding character from string2
  for i, asterisk in enumerate(asterisks):
    string1 = re.sub(asterisk, string2[i], string1, count=1)

  return string1

uncensor("Wh*r* d*d my v*w*ls g*", "eeioeo") #➞ "Where did my vowels go?"

运行时触发错误:

error                                     Traceback (most recent call last)
<ipython-input-28-fee597a500f6> in <module>
     11   return string1
     12 
---> 13 uncensor("Wh*r* d*d my v*w*ls g*", "eeioeo") #➞ "Where did my vowels go?"

6 frames
/usr/lib/python3.8/sre_parse.py in _parse(source, state, verbose, nested, first)
    666                 item = None
    667             if not item or item[0][0] is AT:
---> 668                 raise source.error("nothing to repeat",
    669                                    source.tell() - here + len(this))
    670             if item[0][0] in _REPEATCODES:

error: nothing to repeat at position 0

错误原因

  1. 正则表达式r'\*?'中的?表示匹配前一个字符0次或1次,因此会匹配所有空字符串和*,导致asterisks列表中包含大量空元素。
  2. 循环中使用空字符串作为re.sub的匹配模式时,正则引擎无法解析空表达式,直接抛出"nothing to repeat"错误。
  3. 即使过滤掉空元素,循环调用re.sub的方式也冗余且低效。

解决方案

方法一:遍历字符串替换(无需正则)

def uncensor(string1, string2):
    vowels = iter(string2)
    return ''.join(next(vowels) if char == '*' else char for char in string1)

# 测试
print(uncensor("Wh*r* d*d my v*w*ls g*", "eeioeo"))  # 输出: Where did my vowels go

思路:将元音字符串转为迭代器,遍历被审查字符串的每个字符,遇到*就取出迭代器的下一个元音,否则保留原字符,最后拼接成完整字符串。

方法二:正则替换(高效简洁)

import re

def uncensor(string1, string2):
    vowels = iter(string2)
    return re.sub(r'\*', lambda _: next(vowels), string1)

# 测试
print(uncensor("Wh*r* d*d my v*w*ls g*", "eeioeo"))  # 输出: Where did my vowels go

思路:用re.sub匹配所有*,每次匹配时通过lambda函数从元音迭代器中取出对应字符完成替换,一次调用即可完成所有替换操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:15:38