(回答への質問への回答が長くなったので、回答欄に書きます)
何度も質問すみません。
まずpattern = r\t はraw文字列となり、'%r'ではrepr()での結果が帰ってくるということで宜しかったでしょうか。
そして結論としては、変数で正規表現のパターンを受け取った場合、その変数に格納されている文字列をraw文字列に変換する方法は無いということでしょうか。
repr() はそのとおりです。
「文字列をraw文字列に変換する」ということ自体がありえないのです。
正規表現に使えるメタ文字は http://docs.python.jp/3/library/re.html に掲載されていますが、よく使うのは\sでしょう。さらに、\n, \t などの文字リテラルにおけるエスケープ文字も使用できます。ここで、以下の正規表現パターンを定義したとします。
Python
1>>> a = 'abc\ndef\sghi'
これをrepr(a)すると以下のようになります。
Python
1>>> print(repr(a))
2'abc\ndef\\sghi'
\n と \s で扱いが違っているのが分かります。これはaに代入する前の段階、文字列リテラルをPythonが解釈した時点で"\n" (2文字分)を1文字文の改行コードに変換し、"\s" はそのまま2文字文の文字列として解釈しているためです。"\s"というエスケープ文字はPythonにはないため、sの前のバックスラッシュをそのまま文字として認識したためです。では、raw文字列だとどうなるか。
Python
1>>> b = r'abc\ndef\sghi'
2>>> print(repr(b))
3'abc\\ndef\\sghi'
bに代入する前の文字列の解釈を行うときに、バックスラッシュをバックスラッシュとして解釈するのがraw文字列です。そのため、reprで見ると\nと\sでバックスラッシュの扱いが一緒です。
このように、通常の文字列として解釈するか、raw文字列として解釈するかで、データが異なっています。そしてrawだったかどうかの情報は変数に(文字列データに)保持されていません。 r'' というのはソースコードの読み取り方の指示であって、「raw文字列」というデータフォーマットではありません。なので、raw文字列に変換、という考え方はできません。
もし、raw文字列とするべき文字列を通常の文字列リテラルで書いてしまっているのであれば、ソースコードを修正するべきです。それが出来なくて、どうしてもバックスラッシュの扱いを変更したいのだとしたら、str.replace等を使って、そのような標準エスケープ文字を1つずつ変換するしかありません。しかし、今回のコードでは、input変数に「正しく書かれた正規表現パターン」が渡されてきても変換してしまうので、この方法は使えないでしょう。
結論として、この関数に「正しい正規表現パターンを渡す」以外の方法はありません。