入力の部分文字列を取る再帰関数を書きます。次に、この関数はすべてのルールを調べます。一致するルールごとに、1 つの置換が行われ、残りの文字列が再帰呼び出しによって処理されます。
def apply_rules(rules, input, start=0):
# First yield the outcome of no applied rules.
yield input[start:]
for match, replace in rules:
# Find the first match for this rule.
index = input.find(match, start)
if index < 0:
# No match -- skip to next one
continue
# Prepare the result of the replacement.
prefix = input[start:index] + replace
# Apply further rules to the rest of the string
# by a recursive call.
for suffix in apply_rules(rules, input, index + len(match)):
yield prefix + suffix
次のように使用します。
>>> rules = [('he','e'), ('ll','l'), ('e','ee')]
>>> list(apply_rules(rules, 'hello'))
['hello', 'ello', 'elo', 'helo', 'heello', 'heelo']
この質問へのコメントで示されているように、無限の結果が発生するのを防ぐために、置換された文字列にルールを適用することは許可しないことに注意してください。