从常规字符串('')中告诉原始字符串(r'')?

saa*_*laa 9 python regex string

我目前正在构建一个必须将文件名与模式匹配的工具.为方便起见,我打算提供延迟匹配(以类似glob的方式)和regexp匹配.例如,以下两个片段最终会产生相同的效果:

@mylib.rule('static/*.html')
def myfunc():
    pass

@mylib.rule(r'^static/([^/]+)\.html')
def myfunc():
    pass
Run Code Online (Sandbox Code Playgroud)

AFAIK r''仅对Python解析器有用,它实际上str在解析后创建了一个标准实例(唯一的区别在于它保留了\).

有人知道一种方法来告诉彼此吗?

我不想为同一目的提供两个备用装饰器,或者更糟糕的是,手动解析字符串以确定它是否是正则表达式.

Sve*_*ach 13

你无法区分它们.每个原始字符串文字也可以写为标准字符串文字(可能需要更多引用),反之亦然.除此之外,我肯定会给两个装饰者添加不同的名字.他们不做同样的事情,他们做不同的事情.

示例(CPython):

>>> a = r'^static/([^/]+)\.html'; b = '^static/([^/]+)\.html'
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)

因此,在此特定示例中,原始字符串文字和标准字符串文字甚至会产生相同的字符串对象.

  • 因此,整个设计理念存在缺陷.用户*必须*明确声明它是fnmatch,regexp还是两者都不是.没有假设,没有猜测. (4认同)
  • @saalaa:该示例旨在表明原始字符串文字和标准字符串文字可能无法区分。在这里使用 `==` 而不是 `is` 不会显示任何内容,因为例如 `"a" == u"a"` 会产生 `True`,而完全有可能区分 `str` 对象和 `unicode ` 对象(在 Python 2.x 中)。为了在这里给出一个有效的计数器示例,我必须给出一个示例,其中标准字符串文字和原始字符串文字恰好最终成为“同一个对象”。 (4认同)
  • @saalaa:我完全意识到这一点——这就是为什么我明确指出这是一个 CPython 示例。我还知道,如果您只是将两个作业放在两个单独的行上,该示例将给出不同的结果。但所有这些在这里并不重要——显示一个示例,其中标准字符串文字和原始字符串文字最终是相同的对象证明,无论这个单一的如何,您通常都无法区分它们例子就出现了。 (2认同)

kin*_*all 11

您无法判断字符串是否在事后被定义为原始字符串.就个人而言,我实际上会使用一个单独的装饰器,但如果你不想,你可以使用一个命名参数(例如@rule(glob="*.txt")用于globs和@rule(re=r".+\.txt")regex).

或者,如果用户想要使用正则表达式,则要求用户提供已编译的正则表达式对象,例如@rule(re.compile(r".+\.txt"))- 这很容易检测,因为它的类型不同.