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

input = "Bob is a Bird... Bob is a Plane... Bob is Superman!"
changed = re.sub("Bob is", "It's", input) # Noncompliant
changed = re.sub("\.\.\.", ";", changed) # Noncompliant

Compliant Solution

input = "Bob is a Bird... Bob is a Plane... Bob is Superman!"
changed = str.replace("Bob is", "It's", input)
changed = str.replace("...", ";", changed)

Or, with a regex:

input = "Bob is a Bird... Bob is a Plane... Bob is Superman!"
changed = re.sub(r"\w*\sis", "It's", input)
changed = re.sub(r"\.{3}", ";", changed)