2011-07-08 13 views
0

だから、私はこのタイプのことを何度か見たことがありますが、それについては何も知ることができませんでした。誰かがこれらの "r 'foo(*)'"のことを説明して、それらのためのPythonドキュメントにリンクしてくれますか?私は彼らが文字列でキーワードを見つけることと関係していると思います。私は正しい?これは私にとって何の説明ですか?

(r'why (.*) i (.*)\?', 
("You%1%2?", 
"Perhaps you only think you%1%2")), 

(r'why (.*) you(.*)\?', 
("Why%1 you%2?", 
"%2 I%1", 
"Are you sure I%2?")), 

(r'why (.*)\?', 
("I cannot tell you why%1.", 
"Why do you think %1?")), 

この特定のコードセグメントは、nltk.chat.zenモジュールのものです。

+1

妥当な件名はどうですか? –

+0

@Blackmoon申し訳ありません、私はちょっと疲れていて、今や不満です。 次回よりはっきりしています:) – xBlink

答えて

3

これらは、regular expressionsと思われる。正規表現を使用すると、文字列のパターンをかなり強力かつ洗練された方法で検索できます。彼らは少し暗めにすることができます。これらは、何らかの種類の基本的なチャタラボットの基礎に見えます。

>>> import re 
>>> regex, phrases = (r'why (.*) i (.*)\?', 
... ("You %s %s?", 
... "Perhaps you only think you %s %s")) 
>>> phrase1, phrase2 = phrases 
>>> groups = re.search(regex, 'why am i dumb?') 
>>> phrase1 % (groups.group(1), groups.group(2)) 
'You am dumb?' 
>>> phrase2 % (groups.group(1), groups.group(2)) 
'Perhaps you only think you am dumb' 

ああ、おそらくあなたは、特に何r'blahblah'手段を不思議に思いました。さて、他の人が説明したように、rは生の文字列にするだけです.PythonはREを読みやすくするために、ある種の処理を行いません。


これは、元の意図がこれらの文字列のものに近いものです。彼らは標準的なPythonのグループ置換構文を使用しているようには見えないので、私はそれらがカスタムの代入関数を使用していると仮定します - 動詞形式の変換を処理するのに十分洗練されたものでしょう!基本的な考え方はhereです。 Pythonで

>>> import re 
>>> regex, phrases = (r'why (.*) i (.*)\?', 
... (r'You \g<1> \g<2>?', 
... r'Perhaps you only think you \g<1> \g<2>.')) 
>>> phrase1, phrase2 = phrases 
>>> re.sub(regex, phrase1, 'why am i dumb?') 
'You am dumb?' 
>>> re.sub(regex, phrase2, 'why am i dumb?') 
'Perhaps you only think you am dumb.' 
+0

文字列を検索してパターンを検索するにはどうすればいいですか? – xBlink

+0

@xBlink:あなたは 're'モジュールを使います。 http://docs.python.org/library/re.html – carlpett

+0

もう1つの良いpython regex doc:[howto](http://docs.python.org/howto/regex) – Joram

3

r'something'またはr"something"raw stringsです。通常の文字列と生の文字列の違いは、後者のバックスラッシュ文字(\)をエスケープする必要がないことです。

コードでは、生の文字列の一般的な使用例であるregular expressionsを指定するために生の文字列が使用されているように見えます。

正規表現は、パターンまたは一致パターンを検索するために使用されます。良いチュートリアルhereがあります。

+0

Aah。私は今参照してください。どうもありがとうございました。 – xBlink

0

aixで示されるように、rは、生の文字列であることを示します。また、他の文字列で指摘されているように、問題の文字列は正規表現です。生の文字列は、エスケープする必要がないため正規表現を表すのに便利です(例えば、出力に単一の "\"を得るために\\を書くときは、バックスラッシュをエスケープしています)。正規表現ではバックスラッシュが頻繁に使用されるため、複製しなくても明快さが向上します。

関連する問題