python教程—什么是“原始字符串正则表达式”你如何使用它?-Python实用宝典

python教程—什么是“原始字符串正则表达式”你如何使用它?

python文档的正则表达式,对于' '字符:解决方案是使用Pythona€™年代原始字符串正则的符号 表达模式;反斜杠不以任何特殊的方式处理 前缀为“r”的字符串文字。所以r"n"是一个两个字符的字符串 包含''和'n',而' n'是一个字符串 包含一个换行符。通常模式将用Python表示 使用这个原始字符串符号的代码。

从python文档regex,关于''字符:

The solution is to use Python’s raw string notation for regular
expression patterns; backslashes are not handled in any special way in
a string literal prefixed with 'r'. So r"n" is a two-character string
containing '' and 'n', while "n" is a one-character string
containing a newline. Usually patterns will be expressed in Python
code using this raw string notation.

这个原始字符串符号是什么?如果使用原始字符串格式,这是否意味着将“*”作为一个文字字符,而不是一个零或多个指示器?这显然不可能是正确的,否则regex将完全失去它的能力。但是如果它是一个原始字符串,如果“n”是一个反斜杠和一个“n”,它如何识别换行字符呢?

我不懂。

<强>编辑赏金:< /强>

我试图理解原始字符串regex如何匹配换行、制表符和字符集,例如w用于单词或d用于数字或所有诸如此类的内容,如果原始字符串模式不能将反斜杠识别为普通字符以外的任何内容。我可以用一些很好的例子。

回答

扎克南的回答确实回答了你的问题,但不是直接的。让我试着更直接些,看看我能不能从扎克南那里得到赏金。

如果停止使用术语“原始字符串正则表达式”和“原始字符串模式”,您可能会发现这更容易理解。这些术语合并了两个独立的概念: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';这些字符串被称为raw string ,并使用不同的规则来解释反斜杠转义序列。”这是我们的两个字符的字符串,使用原始字符串表示:

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

所以我们有三个不同的字符串表示,都给出相同的字符串,或字符序列:

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

Now, let's turn to regular expressions. The Python docs, 7.2. re — Regular expression operations says, "Regular expressions use the backslash character ('') to indicate special forms or to allow special characters to be used without invoking their special meaning. This collides with Python’s usage of the same character for the same purpose in string literals..."

如果您想要一个匹配换行字符的Python正则表达式对象,那么您需要一个2个字符的字符串,由反斜杠字符后跟n字符组成。以下代码行全部设置为一个正则表达式对象,该对象识别换行字符:

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

那么,为什么"通常使用这个原始字符串表示法在Python代码中表示模式?因为正则表达式通常是静态字符串,可以方便地表示为字符串文本。当正则表达式包含反斜杠字符时,使用不同的字符串文字表示法可以方便地选择原始字符串。

< /强> < >强问题

强>Q:表达式re.compile(r"stWord")怎么样? A:将字符串与正则表达式编译分开,并分别理解它们,这样更容易理解。

    s = r"stWord" prog = re.compile(s)

字符串s包含8个字符:a 反斜杠, a s, a 反斜杠, a t,然后是4个字符的单词。

Q > /强>:制表符和空格字符发生了什么?A:在Python语言级别,字符串s没有选项卡空格字符。它以四个字符开始:反斜杠s反斜杠t。与此同时,正则表达式系统将该字符串作为正则表达式语言中的源代码,它的意思是“匹配由一个空格字符、一个制表符和四个字符组成的字符串”。

Q > /strong>:如果它被视为反斜杠-s和反斜杠-t,您如何匹配它们? A > /strong>:如果‘you’和‘that’这两个词变得更具体,那么问题可能会更清楚:正则表达式系统如何匹配反斜杠-s和反斜杠-t表达式?作为“任何空白字符”和“选项卡字符”。

Q:或者如果您有一个3个字符的字符串back斜杠-n-newline会怎样? A:在Python语言中,3个字符的字符串back斜杠-n-换行可以表示为常规字符串“\nn”,或者raw加上常规字符串r“n”“n”,或者以其他方式表示。正则表达式系统在找到任何两个连续的换行符字符时,将匹配3个字符的字符串back斜杠-n-换行符。

注意:所有示例和文档引用都指向Python 2.7。

Update > /strong>:包含来自@Vladislav Zorov和@m的答案的澄清。来自@Aerovistae的后续问题。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论

意见反馈 在线咨询 简繁切换 返回评论 返回顶部