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

从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 docs 2.4.1. String literals说:“反斜杠(\)字符用于转义具有特殊含义的字符,例如换行符,反斜杠本身或引号字符。”

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

1 
 

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

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

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

2 \n

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

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

2 \n

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

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

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

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

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

那为什么是"Usually patterns will be expressed in Python code using this raw string notation."?因为正则表达式通常是静态字符串,所以方便地表示为字符串文字。从正则表达式包含反斜杠字符时,原始字符串是一种方便的选择,从可用的不同字符串文字符号中选择。

问题

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

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

字符串s包含八个字符:反斜杠,s,反斜杠,t,然后是四个字符Word

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

:如果将其视为反斜杠-s和反斜杠-t,您如何匹配它们? 一个:如果使单词“you”和“that”更具体,则问题可能更清楚:正则表达式系统如何匹配表达式backlash-s和backslash-t?作为“任何空白字符”和“制表符”。

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

N.B.所有示例和文档参考均针对Python 2.7。

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

用大写字母拆分字符串,但忽略AAA Python Regex - python

我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python-如何检查Redis服务器是否可用 - python

我正在开发用于访问Redis Server的Python服务(类)。我想知道如何检查Redis Server是否正在运行。而且如果某种原因我无法连接到它。这是我的代码的一部分import redis rs = redis.Redis("localhost") print rs 它打印以下内容<redis.client.Redis o…

Python-crontab模块 - python

我正在尝试在Linux OS(CentOS 7)上使用Python-crontab模块我的配置文件如下:{ "ossConfigurationData": { "work1": [ { "cronInterval": "0 0 0 1 1 ?", "attribute&…

Python:检查是否存在维基百科文章 - python

我试图弄清楚如何检查Wikipedia文章是否存在。例如,https://en.wikipedia.org/wiki/Food 存在,但是https://en.wikipedia.org/wiki/Fod 不会,页面只是说:“维基百科没有此名称的文章。”谢谢! 参考方案 >>> import urllib >>> prin…