所以,我曾多次见过这种类型的东西,但我从来没有能够找到任何关于它的东西。有人可以解释一下这些“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模块。
答案 0 :(得分: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.'
答案 1 :(得分:3)
在Python中,r'something'
或r"something"
为raw strings。普通字符串和原始字符串之间的区别在于后者的反斜杠字符(\
)不需要转义。
在您给出的代码中,原始字符串似乎用于指定regular expressions,这是原始字符串的常见用例。
正则表达式用于搜索模式或匹配模式。有一个很好的教程here。
答案 2 :(得分:0)
如aix所述,r
表示它是一个原始字符串。正如其他人所指出的那样,所讨论的字符串是正则表达式。原始字符串对于表示正则表达式很有用,因为它们不需要转义(例如,当您在输出中编写\\
以获得单个“\”时,您已经转义了反斜杠)。正则表达式中反斜杠非常频繁,因此不必复制它们可以提高清晰度。