2011-07-08 81 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

>>> 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

@xBlink另一個好的Python正則表達式文檔:[howto](http://docs.python.org/howto/regex) – Joram

3

在Python,r'something'r"something"raw strings。普通字符串和原始字符串之間的區別在於後面的反斜槓字符(\)不需要轉義。

在您給出的原始字符串中,似乎用於指定regular expressions,這是原始字符串的常見用例。

正則表達式用於搜索模式或匹配模式。有一個很好的教程here

+0

啊。我現在明白了。非常感謝你。 – xBlink

0

正如aix所述,r表示它是一個原始字符串。正如其他人所指出的那樣,所討論的字符串是正則表達式。原始字符串對於表示正則表達式很有用,因爲它們不需要轉義(例如,當您在輸出中寫入\\以獲得單個「\」時,您已經轉義了反斜線)。反斜槓在正則表達式中非常頻繁,因此不必重複它們可以提高清晰度。