<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>正则 on Song</title><link>/tags/%E6%AD%A3%E5%88%99/</link><description>Recent content in 正则 on Song</description><generator>Hugo -- gohugo.io</generator><language>zh-Cn</language><lastBuildDate>Fri, 08 Jul 2022 00:00:00 +0000</lastBuildDate><atom:link href="/tags/%E6%AD%A3%E5%88%99/index.xml" rel="self" type="application/rss+xml"/><item><title>Python 爬虫与正则表达式</title><link>/p/python-%E7%88%AC%E8%99%AB%E4%B8%8E%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/</link><pubDate>Fri, 08 Jul 2022 00:00:00 +0000</pubDate><guid>/p/python-%E7%88%AC%E8%99%AB%E4%B8%8E%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/</guid><description>&lt;h1 id="python-爬虫与正则表达式"&gt;Python 爬虫与正则表达式
&lt;/h1&gt;&lt;h2 id="正则表达式基础"&gt;正则表达式基础
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.runoob.com/regexp/regexp-syntax.html" target="_blank" rel="noopener"
 &gt;正则表达式 – 语法 | 菜鸟教程&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="常用字符说明"&gt;常用字符说明
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;字符&lt;/th&gt;
					&lt;th style="text-align: left"&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;[ABC]&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配字符串中所有的 A、B、C 字母&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;[^ABC]&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配字符串中所有的&lt;strong&gt;非&lt;/strong&gt; A、B、C 字母&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;[A-Z]&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;表示一个区间，匹配所有大写字母；&lt;code&gt;[a-z]&lt;/code&gt; 表示所有小写字母&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;.&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配除换行符（&lt;code&gt;\n&lt;/code&gt;、&lt;code&gt;\r&lt;/code&gt;）之外的任何单个字符，等价于 &lt;code&gt;[^\n\r]&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;\s&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配任何空白字符（空格、制表符、换页符等）；&lt;code&gt;\S&lt;/code&gt; 匹配任何非空白字符&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;^&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配输入字符串的开始位置&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;$&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配输入字符串的结尾位置&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配前面的子表达式零次或一次，或指明非贪婪限定符&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配前面的子表达式&lt;strong&gt;零次或多次&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;+&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配前面的子表达式&lt;strong&gt;一次或多次&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;{n,m}&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;m 和 n 均为非负整数，且 n ≤ m。最少匹配 n 次，最多匹配 m 次。例如 &lt;code&gt;&amp;quot;o{1,3}&amp;quot;&lt;/code&gt; 将匹配 &lt;code&gt;&amp;quot;fooooood&amp;quot;&lt;/code&gt; 中的前三个 o。&lt;code&gt;&amp;quot;o{0,1}&amp;quot;&lt;/code&gt; 等价于 &lt;code&gt;&amp;quot;o?&amp;quot;&lt;/code&gt;。注意逗号和两数之间不能有空格&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;( )&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;标记一个子表达式的开始和结束位置，子表达式可以获取供以后使用（如 &lt;code&gt;(?P&amp;lt;函数名&amp;gt;匹配正则)&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;strong&gt;贪婪与非贪婪模式&lt;/strong&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;在正则表达式中，&lt;code&gt;*&lt;/code&gt;、&lt;code&gt;+&lt;/code&gt;、&lt;code&gt;?&lt;/code&gt; 默认是贪婪的，会尽可能多地匹配内容。例如 &lt;code&gt;&amp;quot;&amp;lt;.*&amp;gt;&amp;quot;&lt;/code&gt; 中的 &lt;code&gt;*&lt;/code&gt; 会匹配到字符串最后的 &lt;code&gt;&amp;gt;&lt;/code&gt;。若要使用非贪婪模式，在限定符后加 &lt;code&gt;?&lt;/code&gt;，如 &lt;code&gt;&amp;quot;&amp;lt;.*?&amp;gt;&amp;quot;&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="python-正则表达式"&gt;Python 正则表达式
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.runoob.com/python/python-reg-expressions.html" target="_blank" rel="noopener"
 &gt;Python 正则表达式 | 菜鸟教程&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="常用函数"&gt;常用函数
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 匹配成功时返回一个匹配对象，否则返回 None。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 可以使用 group(num) 或 groups() 获取匹配表达式。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;re.match&lt;/code&gt; 与 &lt;code&gt;re.search&lt;/code&gt; 的区别&lt;/strong&gt;：&lt;br&gt;
&lt;code&gt;re.match&lt;/code&gt; 只匹配字符串的开始位置，如果开始位置不符合正则表达式，则匹配失败返回 &lt;code&gt;None&lt;/code&gt;；而 &lt;code&gt;re.search&lt;/code&gt; 匹配整个字符串，直到找到第一个匹配。&lt;/p&gt;
&lt;h4 id="参数说明"&gt;参数说明
&lt;/h4&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;参数&lt;/th&gt;
					&lt;th style="text-align: left"&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;pattern&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;匹配的正则表达式&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;要匹配的字符串&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;flags&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;标志位，用于控制匹配方式（如是否区分大小写、多行匹配等）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="flags-修饰符"&gt;flags 修饰符
&lt;/h4&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;修饰符&lt;/th&gt;
					&lt;th style="text-align: left"&gt;描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;re.I&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;使匹配对大小写不敏感&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;re.L&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;做本地化识别（locale-aware）匹配&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;re.M&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;多行匹配，影响 &lt;code&gt;^&lt;/code&gt; 和 &lt;code&gt;$&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;re.S&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;使 &lt;code&gt;.&lt;/code&gt; 匹配包括换行符在内的所有字符&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;re.U&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;根据 Unicode 字符集解析字符，影响 &lt;code&gt;\w&lt;/code&gt;、&lt;code&gt;\W&lt;/code&gt;、&lt;code&gt;\b&lt;/code&gt;、&lt;code&gt;\B&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;&lt;code&gt;re.X&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: left"&gt;允许更灵活的格式，使正则表达式更易于理解&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="recompile-函数"&gt;&lt;code&gt;re.compile&lt;/code&gt; 函数
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;compile&lt;/code&gt; 函数用于编译正则表达式，生成一个正则表达式（Pattern）对象，供 &lt;code&gt;match()&lt;/code&gt; 和 &lt;code&gt;search()&lt;/code&gt; 使用。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;[,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pattern&lt;/code&gt;：字符串形式的正则表达式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;flags&lt;/code&gt;：可选，匹配模式（如忽略大小写、多行模式等）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resub-函数"&gt;&lt;code&gt;re.sub&lt;/code&gt; 函数
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pattern&lt;/code&gt;：正则中的模式字符串&lt;/li&gt;
&lt;li&gt;&lt;code&gt;repl&lt;/code&gt;：替换的字符串，也可为一个函数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;string&lt;/code&gt;：要被查找替换的原始字符串&lt;/li&gt;
&lt;li&gt;&lt;code&gt;count&lt;/code&gt;：模式匹配后替换的最大次数，默认 0 表示替换所有匹配&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>