如何在Python正则表达式中查找每个匹配的确切位置?

如何在Python正则表达式中查找每个匹配的确切位置?

介绍

在Python中,我们使用re模块来使用正则表达式。文本搜索和更复杂的文本操作都使用正则表达式。像grep和sed这样的工具,像vi和emacs这样的文本编辑器,以及像Tcl、Perl和Python这样的计算机语言都具有内置的正则表达式支持。

Python中的re模块提供了用于匹配正则表达式的函数。

定义我们要查找或修改的文本的常规表达式称为模式。该字符串由文本字面值和元字符组成。使用compile函数来创建模式。由于正则表达式通常包含特殊字符,因此建议使用原始字符串。(使用r字符表示原始字符串。)只有在将它们组装成模式后,字符才不会以这种方式解释。

模式组装完成后,可以使用其中一个函数将模式应用于文本字符串。可用的函数包括Match、Search、Find和Finditer。

使用的语法

这里使用的正则表达式函数是:我们使用正则表达式函数查找匹配项。
re.match() : 确定字符串的开头是否与RE匹配。 如果字符串的开头的零个或多个字符与正则表达式模式匹配,则match方法返回一个匹配对象。

p.finditer() : 查找所有满足RE的子字符串,并将它们作为迭代器返回。finditer方法的结果是一个迭代器,该迭代器在字符串中的每个非重叠匹配项上交付匹配对象。

re.compile() : 将正则表达式模式编译成正则表达式对象,可使用其match()、search()和其他方法来进行匹配,如下面所述。 可以通过指定标志的值来修改表达式的行为。 值可以是以下任何变量,使用按位OR(|)运算符组合:

m.start() : m.start()返回匹配的开头在字符串中的偏移量。

m.group() : 当mo.groups()返回一个值元组时,可以使用多赋值方法将每个值分配给不同的变量,如下面的areaCode,mainNumber = mo.groups()行。

search : 它与re.match()类似,但不要求我们只在文本开头查找匹配项。search()函数可以在任何位置的字符串中查找模式,但它仅返回模式的第一个实例。

算法

  • 使用import re导入正则表达式模块。

  • 使用re.compile()函数创建Regex对象。(记得使用原始字符串。)

  • 将要搜索的字符串传递到Regex对象的finditer()方法中。这会返回一个Match对象。

  • 调用Match对象的group()方法返回实际匹配的文本的字符串。

  • 我们还可以使用span()方法()在一个单一的元组中获取开始和结束索引。

示例


\#导入re函数 import re #编译[A-Z0-9]并将其存储在变量p中 p =("[A-Z0-9]")") #在p.finditer中循环m次 for m in p.finditer("A5B6C7D8"):#打印m.start和m.group print m.start(), m.group()

输出

这将输出 −

0 A
1 5
2 B
3 6
4 C
5 7
6 D
7 8

代码解释

使用import re导入正则表达式模块。使用re.compile()函数创建一个正则表达式对象(”[A-Z0-9]”)并将其赋值给一个变量p。使用循环操作m并将要搜索的字符串传递到正则表达式对象的finditer()方法中。这将返回一个Match对象。调用Match对象的m.group()和m.start()方法返回实际匹配文本的字符串。

示例

#Python程序代码,展示
#正则表达式对象的匹配
#与组
import re
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('我的电话是415-555-4242。')
print(mo.groups())

输出

这将返回以下输出—

('415', '555-4242')

代码解释

使用import re导入正则表达式模块。使用re.compile()函数创建一个正则表达式对象(r'(\d\d\d)-(\d\d\d-\d\d\d\d)’)并将其赋值给一个名为phoneNumRegex的变量。将要搜索的字符串传递到Regex对象的search()方法中,并将其存储在一个名为mo的变量中。这将返回一个Match对象。调用Match对象的mo.groups()方法返回实际匹配文本的字符串。

结论

Python re模块提供的search()、match()和finditer()方法允许我们匹配正则表达式模式,如果匹配成功,则提供Match对象实例。可以使用此Match对象的start()、end()和span()方法检索有关匹配字符串的详细信息。

当有很多匹配时,如果使用findall()将其全部加载到内存中,则有可能会超负荷使用RAM,因此要小心使用。可以使用finditer()方法而不是将其全部加载到内存中,以以提高效率,它将以迭代器对象的形式获取所有可能的匹配。

这意味着,finditer()提供了可调用对象,调用它将结果加载到内存中。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程