== Why is this an issue? An `re.sub` call always performs an evaluation of the first argument as a regular expression, even if no regular expression features were used. This has a significant performance cost and therefore should be used with care. When `re.sub` is used, the first argument should be a real regular expression. If it's not the case, `str.replace` does exactly the same thing as `re.sub` without the performance drawback of the regex. This rule raises an issue for each `re.sub` used with a simple string as first argument which doesn't contains special regex character or pattern. === Noncompliant code example [source,python] ---- init = "Bob is a Bird... Bob is a Plane... Bob is Superman!" changed = re.sub(r"Bob is", "It's", init) # Noncompliant changed = re.sub(r"\.\.\.", ";", changed) # Noncompliant ---- === Compliant solution [source,python] ---- init = "Bob is a Bird... Bob is a Plane... Bob is Superman!" changed = init.replace("Bob is", "It's") changed = changed.replace("...", ";") ---- Or, with a regex: [source,python] ---- init = "Bob is a Bird... Bob is a Plane... Bob is Superman!" changed = re.sub(r"\w*\sis", "It's", init) changed = re.sub(r"\.{3}", ";", changed) ----