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
错误原因
- 正则表达式
r'\*?'中的?表示匹配前一个字符0次或1次,因此会匹配所有空字符串和*,导致asterisks列表中包含大量空元素。 - 循环中使用空字符串作为
re.sub的匹配模式时,正则引擎无法解析空表达式,直接抛出"nothing to repeat"错误。 - 即使过滤掉空元素,循环调用
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
相关产品推荐
相关产品推荐

