仅匹配正则表达式的最终字符

时间:2017-04-29 15:05:27

标签: python regex

我有一些Python代码涉及很多re.sub()命令。在某些情况下,我想替换一个字符,但只有在它出现在某些其他字符之后。以下是我目前在python中执行此操作的示例:

secStress = "[aeiou],"[-1]

所以我对此的输入将是一个字符串,如#34; a,s我走路,我哼哼。"我想替换第一个逗号而不是" a"它就在它之前。

问题在于,当我给它一个变量作为re.sub()的输入时,Python并不喜欢。有没有办法可以编写一个正则表达式,指定只有最终字符才能匹配?

2 个答案:

答案 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返回(并且它必须是字符串)都将代替匹配。