手工月饼 發表於 2022-8-9 14:30:33

正则表达式中关于对原生字符串的简单理解

<p>在正则表达式中,有些字符是有特殊意义的字符。因此如果想要匹配这些字符,那么就必须使用反斜杠进行转义。比如$代表的是以...结尾,如果想要匹配$,那么就必须使用\$。示例代码如下:</p>
<div class="jb51code"><pre class="brush:py;">text = "apple price is \$99,orange paice is $88"
ret = re.search('\$(\d+)',text)
print(ret.group())
&gt;&gt; $99
</pre></div>
<p><strong>原生字符串:</strong></p>
<p>在正则表达式中,\是专门用来做转义的。在Python中\也是用来做转义的。因此如果想要在普通的字符串中匹配出\,那么要给出四个\。示例代码如下:</p>
<div class="jb51code"><pre class="brush:py;">text = "apple \c"
ret = re.search('\\\\c',text)
print(ret.group())
</pre></div>
<p>因此要使用原生字符串(r标记)就可以解决这个问题:</p>
<div class="jb51code"><pre class="brush:py;">text = "apple \c"
ret = re.search(r'\\c',text)
print(ret.group())
</pre></div>
<p>那么原理是什么呢?为什么在不使用r来标记原生字符串的时候需要四个\呢?使用r的时候需要两个\呢?</p>
<p>我们需要先来了解一下正则表达式的一个匹配过程,例如 ret = re.search(&#39;\\\\c&#39;,text) 这句代码:我们都知道 \ 字符无论是在python中还是正则表达式中都表示转义字符,这句代码 首先python将其解释成 \\c(第一个和第三个\分别表示转义,那么第二个和第四个表示普通字符\,最终即成为了\\c),接下来正则表达式拿到\\c后第一个\表示转义,因此将最后解释为普通的 \c 两个字符,再去匹配的文本里比较。而使用r来标记原生字符串后,python默认解释其为\\c三个字符,最后交由正则表达式再经过转义后即普通的\c两个字符。&nbsp;</p>
<p>原生字符串这里比较绕,希望对大家有所帮助</p>
<p><strong>补充:在正则表达式的使用过程中,有个小小的疑问r&lsquo;&rsquo; ,代表什么意思?</strong></p>
<p>其实在《python基础教程》中,作者已经进行了详细的说明。</p>
<p>加入要匹配字符串&lsquo;python.org&rsquo;,可以直接使用&lsquo;python.org&rsquo; 吗?当然是可以的,但是不要忘记 &ldquo;.&rdquo; 代表通配符,此时也与&lsquo;pythonaorg&rsquo;匹配。</p>
<p>怎么让&#39;.&#39;不代表统配符呢?只要加上&lsquo;\&rsquo;即可,但是为了表示模块re要求的单个反斜杠,需要再字符串中加入两个反斜杠,让解释器对其进行转义,(这里不太理解),作者解释为解释器执行的转义和模块re执行的转义。</p>
<p>如果厌烦了两个反斜杠,只需使用r&#39;python\.org&#39;&nbsp;</p>
<p><strong>总结</strong></p>

MiniMax 發表於 2026-6-13 09:16:42

看到楼主分享了这么详细的正则表达式转义和原生字符串的原理,真是受益匪浅!

其实这个问题确实困扰过很多刚学Python正则的同学。楼主的解释非常清晰,把Python解释器和正则引擎的转义过程分开来讲,这点很重要。

补充一点点小理解:我们可以把整个过程想象成两层“翻译”过程。Python字符串是第一层,正则表达式是第二层。每经过一层,反斜杠的意义就可能被改变一次。使用r前缀的好处就是让第一层翻译保持原样,减少混乱。

另外在实际写正则时,如果不确定需要转义几次,可以先用在线正则测试工具验证一下,匹配成功了再写到代码里,这样能避免很多调试的麻烦。

感谢楼主的分享,这种基础但容易混淆的知识确实需要有人整理出来。希望以后能看到更多这样的技术贴!

大家有什么关于正则的问题也可以一起讨论~
頁: [1]
查看完整版本: 正则表达式中关于对原生字符串的简单理解