如风自在 發表於 2026-1-6 11:04:27

怎么在Python的正则表达式中找到每个匹配的确切位置

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">简介</a></li><li><a href="#_label1">使用的语法</a></li><li><a href="#_label2">算法</a></li><li><a href="#_label3">示例</a></li><ul class="second_class_ul"><li><a href="#_lab2_3_0">输出</a></li></ul><li><a href="#_label4">代码说明</a></li><ul class="second_class_ul"></ul><li><a href="#_label5">示例</a></li><ul class="second_class_ul"></ul><li><a href="#_label6">输出</a></li><ul class="second_class_ul"></ul><li><a href="#_label7">代码说明</a></li><ul class="second_class_ul"></ul><li><a href="#_label8">结论</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>简介</h2>
<p>re 模块是我们在 Python 中用于正则表达式的模块。文本搜索和更复杂的文本操作都使用正则表达式。grep 和 sed 等工具、vi 和 emacs 等文本编辑器以及 Tcl、Perl 和 Python 等计算机语言都具有内置的正则表达式支持。</p>
<p>Python 中的 re 模块提供用于匹配正则表达式的函数。</p>
<p>定义我们要查找或修改的文本的正则表达式称为模式。文本文字和元字符组成了这个字符串。编译函数用于创建模式。建议使用原始字符串,因为正则表达式经常包含特殊字符。(r 字符用于指示原始字符串。)字符在组装成模式之前不会以这种方式解释。</p>
<p>其中一个函数可用于在模式组合后将模式应用于文本字符串。可用的函数包括 Match、search、find 和 finditer。</p>
<p class="maodian"><a name="_label1"></a></p><h2>使用的语法</h2>
<p>此处使用的正则表达式函数是:我们使用正则表达式函数查找匹配项。</p>
<ul><li><strong>re.match()</strong>:确定 RE 是否在字符串开头匹配。如果字符串开头的零个或多个字符与正则表达式模式匹配,则 match 方法返回匹配对象。</li><li></li><li><strong>p.finditer()</strong>:查找 RE 匹配的所有子字符串并将它们作为迭代器返回。迭代器在字符串中为模式的所有非重叠匹配项提供匹配对象是 finditer 方法的结果。</li><li><strong>re.compile()</strong>:将正则表达式模式编译为正则表达式对象,可以使用其 match()、search() 和下面描述的其他方法进行匹配。可以通过指定标志的值来修改表达式的行为。值可以是使用按位或(| 运算符)组合的以下任何变量。</li><li><strong>m.start()</strong>:m.start() 返回匹配开始时字符串中的偏移量。</li><li><strong>m.group()</strong>:当 mo.groups() 返回一组值时,您可以使用多重赋值方法将每个值分配给不同的变量,如下面的 areaCode, mainNumber = mo.groups() 行中所示。</li><li><strong>search</strong>:它与 re.match() 类似,但不要求我们只在文本开头查找匹配项。search() 函数可以在字符串中的任何位置定位模式,但它只返回模式的第一个实例。</li></ul>
<p class="maodian"><a name="_label2"></a></p><h2>算法</h2>
<ul><li><p>使用 import re 导入 regex 模块。</p></li><li><p>使用 re.compile() 函数创建 Regex 对象。(记得使用原始字符串。)</p></li><li><p>将要搜索的字符串传递给 Regex 对象的 finditer() 方法。这将返回一个 Match 对象。</p></li><li><p>调用 Match 对象的 group() 方法返回实际匹配文本的字符串。</p></li><li><p>我们还可以使用 span() 方法获取单个元组中的开始和结束索引。</p></li></ul>
<p class="maodian"><a name="_label3"></a></p><p class="maodian"><a name="_label5"></a></p><h2>示例</h2>
<div class="jb51code"><pre class="brush:py;">#importing re functions
import re
#compiling and storing it in a variable p
p = re.compile("")
#looping m times in p.finditer
for m in p.finditer('A5B6C7D8'):
#printing the m.start and m.group
   print m.start(), m.group()</pre></div>
<p class="maodian"><a name="_lab2_3_0"></a></p><h3>输出</h3>
<p>这给出了输出 -</p>
<blockquote><p>0 A<br />1 5<br />2 B<br />3 6<br />4 C<br />5 7<br />6 D<br />7 8</p></blockquote>
<p class="maodian"><a name="_label4"></a></p><p class="maodian"><a name="_label7"></a></p><h2>代码说明</h2>
<p>使用 import re 导入 regex 模块。使用 re.compile() 函数创建一个 Regex 对象(&quot;&quot;)并将其分配给变量 p。对 m 运行循环并将要搜索的字符串传递到 Regex 对象的 finditer() 方法中。这将返回一个 Match 对象。调用 Match 对象的 m.group() 和 m.start() 方法返回实际匹配文本的字符串。</p>
<h2>示例</h2>
<div class="jb51code"><pre class="brush:py;"># Python program to illustrate
# Matching regex objects
# with groups
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('My number is 415-555-4242.')
print(mo.groups())</pre></div>
<p class="maodian"><a name="_label6"></a></p><h2>输出</h2>
<p>这给出了输出 -</p>
<blockquote><p>(&#39;415&#39;, &#39;555-4242&#39;)</p></blockquote>
<h2>代码说明</h2>
<p>使用 import re 导入 regex 模块。使用 re.compile() 函数创建一个 Regex 对象 (r&#39;(\d\d\d)-(\d\d\d-\d\d\d\d)&#39;),并将其赋值给变量 phoneNumRegex。将要搜索的字符串传入 Regex 对象的 search() 方法,并将其存储在变量 mo 中。这将返回一个 Match 对象。调用 Match 对象的 mo.groups() 方法返回实际匹配文本的字符串。</p>
<p class="maodian"><a name="_label8"></a></p><h2>结论</h2>
<p>Python re 模块提供的 search()、match() 和 finditer() 方法允许我们匹配正则表达式模式,如果匹配成功,它将提供 Match 对象实例。利用 start()、end() 和 span() 方法使用此 Match 对象检索有关匹配字符串的详细信息。</p>
<p>当有许多匹配项时,如果使用 findall() 加载所有匹配项,则存在 RAM 过载的危险。您可以以迭代器对象的形式获取所有潜在匹配项,而不是使用 finditer() 方法,这将提高效率。</p>
<p>这意味着 finditer() 提供了一个可调用对象,当调用该对象时,它会将结果加载到内存中。</p>
頁: [1]
查看完整版本: 怎么在Python的正则表达式中找到每个匹配的确切位置