当前位置: 首页 > 面试题库 >

“原始字符串正则表达式”到底是什么?如何使用它?

太叔涵亮
2023-03-14
问题内容

从regex上的python文档中,关于'\'字符:

解决方案是将Python的原始字符串表示法用于正则表达式模式。反斜杠不会以任何特殊方式处理以开头的字符串文字'r'。所以,r"\n"是包含两个字符的字符串'\''n',虽然"\n"是包含一个换行符一个一个字符的字符串。通常,模式将使用此原始字符串表示法在Python代码中表示。

此原始字符串表示法是什么?如果您使用原始字符串格式,这意味着"*"将其视为文字字符而不是零个或多个指示符吗?这显然是不对的,否则正则表达式将完全失去其功能。但是,如果它是原始字符串,那么如果"\n"实际上是反斜杠和,它将如何识别换行符"n"

我不懂

编辑赏金:

我试图了解原始字符串正则表达式如何与换行符,制表符和字符集匹配,例如,\w对于单词或\d数字或其他所有字符,如果原始字符串模式不能识别反斜杠是普通字符以外的其他东西。我真的可以使用一些很好的例子。


问题答案:

Zarkonnen的回答确实回答了您的问题,但没有直接回答。让我尝试更直接一些,看看我是否可以从扎尔肯恩那里获得赏金。

如果您停止使用术语“原始字符串正则表达式”和“原始字符串模式”,则可能会更容易理解。这些术语将两个不同的概念混为一谈:Python源代码中特定字符串的表示形式,以及该字符串表示的正则表达式。

实际上,将它们视为两种不同的编程语言(每种都有自己的语法)会很有帮助。Python语言具有源代码,该源代码除其他外可以构建具有某些内容的字符串,并调用正则表达式系统。正则表达式系统具有驻留在字符串对象中并与字符串匹配的源代码。两种语言都使用反斜杠作为转义字符。

首先,了解一个字符串是一个字符序列(即字节或Unicode代码点;这里的区别并不重要)。有多种方法可以在Python源代码中表示字符串。一个 原始字符串
仅仅是这些表象之一。如果两个表示产生相同的字符序列,则它们会产生等效的行为。

想象一个2字符的字符串,由 反斜杠 字符和 n 字符组成。如果您知道 反斜杠 的字符值为92, n
的字符值为110,则此表达式将生成我们的字符串:

s = chr(92)+chr(110)
print len(s), s

2 \n

常规的Python字符串表示法"\n"不会生成此字符串。而是生成带有换行符的单字符字符串。在Python文档 2.4.1。
字符串文字
说:“反斜杠(\)字符用于转义具有特殊含义的字符,例如换行符,反斜杠本身或引号字符。”

s = "\n"
print len(s), s

1

(请注意,在此示例中看不到换行符,但是如果仔细看,您会在“ 1”之后看到空白行。)

要获得两个字符的字符串,我们必须使用另一个 反斜杠 字符来转义原始 反斜杠 字符的特殊含义:

s = "\\n"
print len(s), s

2 \n

如果要表示其中包含许多 反斜杠 字符的字符串怎么办?Python文档 2.4.1。
字符串文字
继续,“字符串文字可以选择以字母’r’或’R’开头;此类字符串称为 原始字符串, 并使用不同的规则来解释反斜杠转义序列。”
这是我们的两个字符的字符串,使用原始字符串表示形式:

s = r"\n"
print len(s), s

2 \n

因此,我们有三种不同的字符串表示形式,它们都给出相同的字符串或字符序列:

print chr(92)+chr(110) == "\\n" == r"\n"
True

现在,让我们来看一下正则表达式。在Python文档,7.2。re
正则表达式操作
说:“正则表达式使用反斜杠字符(’')表示特殊形式或允许使用特殊字符而无需调用特殊含义。这与Python在同一目的中出于相同目的使用同一字符相冲突。字符串文字…”

如果您想要一个与换行符匹配的Python正则表达式对象,则需要一个2个字符的字符串,该字符串由 反斜杠 字符和 n
字符组成。以下代码行都将prog设置为可识别换行符的正则表达式对象:

prog = re.compile(chr(92)+chr(110))
prog = re.compile("\\n")
prog = re.compile(r"\n")

因此,为什么“通常使用这种原始字符串表示法在Python代码中表示模式”。?因为正则表达式通常是静态字符串,所以方便地表示为字符串文字。从正则表达式包含 反斜杠
字符时,原始字符串是一种方便的选择,从可用的不同字符串文字符号中选择。

问题

:那表情re.compile(r"\s\tWord")呢? :通过将字符串与正则表达式编译分开,并分别理解它们,会更容易理解。

s = r"\s\tWord"
prog = re.compile(s)

该字符串s包含八个字符: 反斜杠s反斜杠t 和四个字符Word

:制表符和空格字符会怎样? :在Python语言级别,字符串s没有 制表符空格 字符。它从四个大字: 反斜杠
小号反斜杠牛逼
。同时,正则表达式系统将该字符串视为正则表达式语言中的源代码,其含义是“匹配由空格字符,制表符和四个字符组成的字符串Word

:如果将其当作反斜杠和反斜杠t对待,您如何匹配它们? :也许将单词“ you”和“
that”更具体地说明一个问题:正则表达式系统如何匹配表达式backlash-s和backslash-t?作为“任何空白字符”和“ 制表 符”。

:或者如果您有3个字符的字符串反斜杠-n-换行符,该怎么办? :在Python语言中,可以将3个字符的字符串反斜杠-n-
换行符表示为常规字符串"\\n\n",或原始加常规字符串r"\n" "\n"或其他方式。当找到任何两个连续的换行符时,正则表达式系统将匹配3个字符的字符串反斜杠-n- 换行符

注意:所有示例和文档参考均针对Python 2.7。

更新 :合并了@Vladislav Zorov和@ m.buettner的答案以及@Aerovistae的后续问题的说明。



 类似资料:
  • 问题内容: 有没有办法在Java中使用原始字符串(没有转义序列)? (我正在编写大量的正则表达式代码,而原始字符串会使我的代码更具可读性) 我了解该语言不会直接提供此功能,但是有什么方法可以以任何方式“模拟”它们吗? 问题答案: 不,没有。 通常,您会将原始字符串和正则表达式放在属性文件中,但是它们也有一些转义序列要求。

  • 我有很多充满换行符的文本文件,我用python 3.4解析它们。我正在寻找换行符,因为它们将我的文本分成不同的部分。下面是一段文字的例子: 我天真地开始在正则表达式(RE)中查找带有' < code>\n '的换行符,没有想到反斜杠' < code>\ '是一个转义符。然而,结果证明这很好: 然后,我明白我应该使用双反斜杠来寻找一个反斜杠。这也很好: 但是在另一个线程上,我被告知使用原始字符串而不

  • 问题内容: 我有一个字符串,我想使用regex表达式拆分此字符串,以便该函数返回数组: 我将如何使用Swift进行此操作? 编辑 我的问题不同于链接的问题。我意识到您可以使用迅速拆分字符串。问题是该问题没有解决如何制作正则表达式的问题。我尝试使用,但是没有用。 如何使该部分成为正则表达式? 问题答案: Swift到目前为止还没有本地正则表达式。但提供。 运行此将输出

  • 本文向大家介绍Java使用正则表达式判断字符串是否以字符开始,包括了Java使用正则表达式判断字符串是否以字符开始的使用技巧和注意事项,需要的朋友参考一下 Java 正则表达式判断字符串是否以字符开始: 以上所述是小编给大家介绍的Java使用正则表达式判断字符串是否以字符开始,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对呐喊教程网站的支持!

  • 问题内容: 我正在尝试匹配\ ^ c形式的控制字符,其中c是控制字符的任何有效字符。我有这个正则表达式,但目前无法使用: 我认为问题在于,插入符号(^)是正则表达式解析引擎的一部分。 问题答案: 使用pattern 匹配形式的ASCII文本字符串,仅此而已。将形式的ASCII文本字符串与模式匹配。你不妨约束点缀到,所以。对于方括号字符类而言,它更容易阅读,因此对于原义BACKSLASH,其后是原义

  • 我需要一个只有文字的明文,不包括所有数字、额外空格、破折号、逗号、点、括号等。它用于文字生成算法(取自gamasutra)。我想正则表达式在这里会有所帮助。我如何在String.split的帮助下做到这一点? UPD: 输入:我有1337这样一个字符串,其中包含不同的内容:逗号、许多空格、数字-2 3 4、破折号。如何删除所有内容? 输出:我有这样一个字符串,里面有不同的东西,逗号,很多空格,数字