正则表达式中(?s)与(?m)的区别解析
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">正则表达式中(?s)与(?m)的区别</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">理论:</a></li><li><a href="#_lab2_0_1">实践:</a></li></ul><li><a href="#_label1">正则表达式re.S与re.M的区别</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_2">一、python中的re模块</a></li><li><a href="#_lab2_1_3">二、re.S与re.M的区别</a></li><li><a href="#_lab2_1_4">三、案例演示</a></li><li><a href="#_lab2_1_5">四、复习一下正则表达式</a></li></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>正则表达式中(?s)与(?m)的区别</h2><p class="maodian"><a name="_lab2_0_0"></a></p><h3>理论:</h3>
<p>(?m) 和 (?s) 是正则表达式中的两个模式标志,它们具有不同的作用:</p>
<p>1.(?m) 多行模式标志(也称为 “multiline” 模式):</p>
<ul><li>默认情况下,正则表达式将整个输入字符串视为单行</li><li>多行文本中使用该标志时,正则表达式会匹配每一行</li></ul>
<p>2.(?s) 单行模式标志(也称为 “dotall” 模式):</p>
<ul><li>默认情况下,. 元字符匹配除了换行符之外的任意字符。</li><li>当使用 单行模式标志时,. 元字符将匹配包括换行符在内的任意字符。</li></ul>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>实践:</h3>
<div class="jb51code"><pre class="brush:py;">import re
pattern1 = r'^.*'
pattern2 = r'(?m)^.*'
pattern3 = r'(?s)^.*'
matches1 = re.findall(pattern1, "Hello\nWorld")
matches2 = re.findall(pattern2, "Hello\nWorld")
matches3 = re.findall(pattern3, "Hello\nWorld")
print(matches1)# 输出:['Hello']
print(matches2)# 输出:['Hello', 'World']
print(matches3)# 输出:['Hello\nWorld']</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>正则表达式re.S与re.M的区别</h2>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>一、python中的re模块</h3>
<div class="jb51code"><pre class="brush:py;">import re # 导入re模块</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>二、re.S与re.M的区别</h3>
<p>1. re.S表示单行匹配模式</p>
<p>2. re.M表示多行匹配模式</p>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>三、案例演示</h3>
<p>1. re.M多行匹配</p>
<div class="jb51code"><pre class="brush:py;">import re
string = '''
hate is a beautiful feel
love you very much
love she
love her
'''
pattern = re.compile(r'^love',re.M) # re.M 多行模式
ret = pattern.findall(string)
print(ret) # ['love', 'love', 'love']</pre></div>
<p>2. re.S单行匹配</p>
<div class="jb51code"><pre class="brush:py;">import re
string = '''<div>沁园春-雪
北国风光
千里冰封
万里雪飘
望长城内外
惟余莽莽
大河上下
顿失滔滔
山舞银蛇
原驰蜡象
欲与天公试比高
</div>'''
pattern = re.compile(r'^<div>(.*?)</div>',re.S) # re.S 单行模式
ret = pattern.findall(string)
print(ret) # ['沁园春-雪\n北国风光\n千里冰封\n万里雪飘\n望长城内外\n惟余莽莽\n大河上下\n顿失滔滔\n山舞银蛇\n原驰蜡象\n欲与天公试比高\n']</pre></div>
<p>【.】可以匹配除换行符之外的所有字符,当设置成re.S之后,可以简单理解为:【.】可以匹配换行符,所以【.】可以匹配所有字符</p>
<p> 3. \w+不能匹配换行符</p>
<div class="jb51code"><pre class="brush:py;">import re
string = '''<div>沁园春-雪
北国风光
千里冰封
万里雪飘
望长城内外
惟余莽莽
大河上下
顿失滔滔
山舞银蛇
原驰蜡象
欲与天公试比高
</div>'''
pattern = re.compile(r'^<div>(\w+)</div>',re.S) # re.S 单行模式
ret = pattern.findall(string)
print(ret) # [],匹配为空</pre></div>
<p class="maodian"><a name="_lab2_1_5"></a></p><h3>四、复习一下正则表达式</h3>
<blockquote><p>1. 单字符:<br />. : 除换行之外所有字符<br />[]: 匹配集合中任意一个字符<br />\d: 数字 <br />\D: 非数字<br />\w: 数字、子母、下划线、中文<br />\W: 非\w<br />\s: 所有的空白字符<br />\S: 非空白字符<br />2. 数量修饰:<br />*:任意次数 >=0<br />+: 至少1次 >=1<br />?: 可有可无 0次或者1次<br />{m}: 固定m次<br />{m,}: 至少m次<br />{m,n}: m-n次<br />3. 边界:<br />^: 以...开头<br />$: 以...结尾<br />4. 分组:<br />(): 视为一个整体<br />(ab){4}:视为一个整体,匹配次数<br />(): 子模式\组模式 \1 \2<br />5. 取消贪婪模式<br />.*?<br />.+?<br />6. 查找<br />match: 只从开头开始找<br />search: 从任意位置开始找<br />findall: 找所有</p></blockquote>
<p>1. 分组子模式</p>
<div class="jb51code"><pre class="brush:py;">import re
string = '''<p><div><span>猪八戒</span></div></p>'''
pattern = re.compile(r'^<(\w+)><(\w+)>\w+</\2></\1>')
ret = pattern.search(string)
print(ret) # <_sre.SRE_Match object; span=(3, 30), match='<div><span>猪八戒</span></div>'></pre></div>
頁:
[1]