我有一些Python代码涉及很多re.sub()命令。在某些情况下,我想替换一个字符,但只有在它出现在某些其他字符之后。以下是我目前在python中执行此操作的示例:
secStress = "[aeiou],"[-1]
所以我对此的输入将是一个字符串,如#34; a,s我走路,我哼哼。"我想替换第一个逗号而不是" a"它就在它之前。
问题在于,当我给它一个变量作为re.sub()的输入时,Python并不喜欢。有没有办法可以编写一个正则表达式,指定只有最终字符才能匹配?
答案 0 :(得分:2)
您正在寻找捕获组/反向引用或积极的后视解决方案:
s = "a,s I walk, I hum."
# Capturing group / backreference
print(re.sub(r"([aeiou]),", r"\1", s))
# Positive lookbehind
print(re.sub(r"(?<=[aeiou]),", "", s))
请参阅Python demo。
第一个方法细节
([aeiou])
是一个与元音匹配的捕获组,并将其存储在一个特殊的内存缓冲区中,您可以使用反向引用从替换模式中引用它。此处,组ID为1,因此您可以使用r"\1"
访问该值。
第二个方法细节
如果在当前位置之前有一个元音,则(?<=[aeiou])
是一个正面的后视,只检查(但不会将文本添加到匹配值)。因此,只有那些前面带有元音的逗号匹配,并且用空字符串替换它就足以删除逗号,因为它是匹配中保留的唯一符号。
答案 1 :(得分:0)
如果我理解正确的话,
>>> import re
>>> def doit(matchobj):
... return matchobj.group()[0]
...
>>> re.sub(r'[aeiou],', doit, "a,s I walk, I hum.")
'as I walk, I hum.'
如果正则表达式匹配,则使用匹配的对象调用doit
。无论字符串doit
返回(并且它必须是字符串)都将代替匹配。