仅当重复且不是单词的一部分时才用另一个字符替换

时间:2019-03-28 02:04:18

标签: python regex python-3.x

在Python3中,以下代码将*的字符串(两个或多个)替换为x

import re
re.sub(r'\*(?=\*)|(?<=\*)\*', 'x', 'Replace this *** but not this *')
# 'Replace this xxx but not this *'

但是,如果我还想免除作为“单词”一部分的*字符串,如下所示? (即,字符串被附加到一个或多个[a-zA-Z]字符上。)

text = "Don't replace foo*** or **bar, either."
# unmodified text expected

我该怎么做?我可能也可以匹配豁免的案件,并使用替换函数来处理它们,但是还有更好的方法吗?

2 个答案:

答案 0 :(得分:7)

regex = r"\s\*{2,}[\s\n]"

这匹配2个或更多*个字符,用空格包围(或以换行符结尾)

可以这样称呼吗?

regex = r"\s\*{2,}[\s\n]"


def replacer(match):
    return 'x' * len(match.group())

re.sub(regex, replacer, your_string_here)

答案 1 :(得分:1)

这个答案是丹妮尔·M(Danielle M.)的灵感来源。下面的这种模式似乎给了我我想要的。其余与她的相同。

regex = r'(?<![a-zA-Z])\*{2,}(?![a-zA-Z])'