4

编辑:一旦你了解了“r”标志的含义,这个问题就没有意义了。更多细节在这里。对于寻找快速答案的人,我在下面添加了。

如果我在 Python 脚本中手动输入正则表达式,我可以为我的模式字符串使用 4 种标志组合:

  • p1 =“模式”
  • p2 = u“模式”
  • p3 = r“模式”
  • p4 = ru“模式”

我有一堆来自 Web 表单输入的 unicode 字符串,并希望将它们用作正则表达式模式。

我想知道我应该对字符串应用什么过程,这样我可以从上面的手动表单的使用中得到类似的结果。就像是 :

import re
assert re.match(p1, some_text) == re.match(someProcess1(web_input), some_text)
assert re.match(p2, some_text) == re.match(someProcess2(web_input), some_text)
assert re.match(p3, some_text) == re.match(someProcess3(web_input), some_text)
assert re.match(p4, some_text) == re.match(someProcess4(web_input), some_text)

someProcess1 到 someProcessN 是什么,为什么?

我想 someProcess2 不需要做任何事情,而 someProcess1 应该做一些 unicode 转换为本地编码。对于原始字符串文字,我一无所知。

4

3 回答 3

7

除了可能必须正确编码 Unicode(在 Python 2.* 中)之外,不需要任何处理,因为“原始字符串”没有特定类型——它只是文字的语法,即字符串常量,你不需要在你的代码片段中有任何字符串常量,所以没有什么要“处理”的。

于 2010-01-17T16:44:33.327 回答
2

“r” 标志只是阻止 Python 解释字符串中的“\”。由于 Web 并不关心它携带什么样的数据,因此您的 Web 输入将是一堆字节,您可以自由地以您想要的方式解释。

所以要解决这个问题:

  • 确保您一直使用 Unicode(例如 utf-8)
  • 当你得到字符串时,它将是 Unicode 并且 "\n"、"\t" 和 "\a" 将是文字,所以你不需要关心是否需要对它们进行转义。
于 2010-01-17T17:06:35.923 回答
2

请注意第一个示例中的以下内容:

>>> p1 = "pattern"
>>> p2 = u"pattern"
>>> p3 = r"pattern"
>>> p4 = ur"pattern" # it's ur"", not ru"" btw
>>> p1 == p2 == p3 == p4
True

虽然这些构造看起来不同,但它们都做同样的事情,它们创建一个字符串对象(p1 和 p3 astr和 p2 和 p4unicode在 Python 2.x 中的一个对象),包含值“ pattern”。,并且只是告诉解析器如何解释以下带引号的字符串,即作为 unicode 文本 ( u)和/或原始文本 ( ),其中用于编码其他字符的反斜杠被忽略。然而,最终如何创建字符串并不重要,无论是否为原始字符串,在内部它都存储相同。rurur

当您将 unicode 文本作为输入时,如果它是unicode文本或str对象,则必须有所不同(在 Python 2.x 中)。如果您想使用 unicode 内容,您应该只在内部使用这些内容,并将所有str对象转换为unicode对象(使用硬编码文本str.decode()的语法或使用u'text'硬编码文本的语法)。但是,如果您将其编码为本地编码,则会遇到 unicode 符号的问题。

另一种方法是使用 Python 3,该str对象直接支持 unicode 并将所有内容存储为 unicode,您根本不需要关心编码。

于 2010-01-17T17:10:05.307 回答