详解Python匹配多行文本块的正则表达式

 更新时间:2023年06月14日 10:01:20   作者:迹忆客  
这篇文章主要介绍了Python 匹配多行文本块的正则表达式,该解决方案折衷了已知和未知模式的几种方法,并解释了匹配模式的工作原理,本文给大家介绍的非常详细,需要的朋友可以参考下

本文讨论了在多行字符串中搜索特定模式的方法。 该解决方案折衷了已知和未知模式的几种方法,并解释了匹配模式的工作原理。

编写正则表达式以匹配多行字符串的原因

假设我们有以下文本块:

Any compiled body of information is known as a data set. Depending on the situation's specifics, this may be a database or a simple array.\n
\n
IBM first used the term "data set," which meant essentially the same thing as "file," to describe a collection of related records.

从上面给出的文本块中,需要找到起始文本,文本在下面几行呈现。 重要的是要注意 \n 表示换行符而不是文字文本。

总而言之,我们想要跨多行查找和匹配文本,忽略文本之间可能出现的任何空行。 在上述文本的情况下,它应该返回 Any compiled body… 行,并且 IBM 首先在单个正则表达式查询中使用了 term… 行。

匹配多行字符串的可能解决方案

在讨论这个特定问题的解决方案之前,必须了解 regex(正则表达式)API 的不同方面,尤其是那些在整个解决方案中经常使用的方面。

那么,让我们从 re.compile() 开始吧。

Python re.compile() 方法

re.compile() 将正则表达式模式编译为正则表达式对象,我们可以使用该对象与 match()、search() 和其他描述的方法进行匹配。

re.compile() 相对于未编译模式的优势之一是可重用性。 我们可以多次使用已编译的表达式,而不是为每个未编译的模式声明一个新字符串。

import re as regex
pattern = regex.compile(".+World")
print(pattern.match("Hello World!"))
print(pattern.search("Hello World!"))

输出:

<re.Match object; span=(0, 11), match='Hello World'>
<re.Match object; span=(0, 11), match='Hello World'>

Python re.search() 方法

re.search() 在字符串中搜索匹配项,如果找到则返回一个 Match 对象。

如果存在多个匹配项,我们将返回第一个实例。

我们也可以不使用re.compile()直接使用,适用于只需要查询一次的情况。

import re as regex
print(regex.search(".+World", "Hello World!"))

输出:

<re.Match object; span=(0, 11), match='Hello World'>

Python re.finditer() 方法

re.finditer() 匹配字符串中的模式并返回一个迭代器,该迭代器为所有非重叠匹配项提供 Match 对象。

然后我们可以使用迭代器迭代匹配项并执行必要的操作; 匹配按照它们在字符串中从左到右的找到方式排序。

import re as regex
matches = regex.finditer(r'[aeoui]', 'vowel letters')
for match in matches:
    print(match)

输出:

<re.Match object; span=(1, 2), match='o'>
<re.Match object; span=(3, 4), match='e'>
<re.Match object; span=(7, 8), match='e'>
<re.Match object; span=(10, 11), match='e'>

Python re.findall() 方法

re.findall() 返回字符串中模式的所有非重叠匹配项的列表或元组。 从左到右扫描一个字符串。 并且匹配按照它们被发现的顺序返回。

import re as regex
# Find all capital words
string= ',,21312414.ABCDEFGw#########'
print(regex.findall(r'[A-Z]+', string))

输出:

['ABCDEFG']

Python re.MULTILINE 方法

re.MULTILINE 的一个显着优势是它允许 ^ 在每一行的开头而不是仅在字符串的开头搜索模式。

Python 正则表达式符号

当以复杂的方式使用时,正则表达式符号很快就会变得非常混乱。 以下是我们解决方案中使用的一些符号,以帮助更好地理解这些符号的基本概念。

  • ^ 断言行首的位置
  • 字符串匹配(区分大小写的)字符“字符串”
  • . 匹配所有字符(用于行终止的符号除外)
  • 尽可能频繁地匹配先前给定的标记。
  • \n 匹配换行符
  • \r 匹配一个 (CR) 回车符
  • ? 与前一个标记匹配 0-1 次
  • +? 尽可能少地匹配前一个标记 1 到无限次。
  • a-z 匹配 a 和 z 之间范围内的单个字符(区分大小写)

使用 re.compile() 匹配 Python 中的多行文本块

让我们了解使用不同的模式。

示例代码:

import re as regex
multiline_string = "Regular\nExpression"
print(regex.search(r'^Expression', multiline_string, regex.MULTILINE))

输出:

<re.Match object; span=(8, 18), match='Expression'>

上面的表达式首先断言它在行首的位置(由于 ^),然后搜索“表达式”的确切出现。

使用 MULTILINE 标志确保检查每一行是否出现“表达式”,而不仅仅是第一行。

示例代码:

import re as regex
data = """Any compiled body of information is known as a data set. Depending on the situation's specifics, this may be a database or a simple array.\n
\n
IBM first used the term "data set," which meant essentially the same thing as "file," to describe a collection of related records.
"""
result = regex.compile(r"^(.+)(?:\n|\r\n)+((?:(?:\n|\r\n?).+)+)", regex.MULTILINE)
print(result.search(data)[0].replace("\n", ""))

输出:

Any compiled body of information is known as a data set. Depending on the situation's specifics, this may be a database or a simple array.IBM first used the term "data set," which meant essentially the same thing as "file," to describe a collection of related records.

正则表达式可以分解并简化为更小的块以提高可读性:

在第一个捕获组 (.+) 中,每个字符都在行中匹配(除了与行终止符对应的任何符号); 这个过程尽可能频繁地进行。

之后,在非捕获组 (?:\n|\r\n) 中,尽可能多地匹配一个行结束符或者一个行结束符加回车。

至于第二个捕获组 ((?:(?:\n|\r\n?).+)+,它由一个非捕获组 (?:(?:\n|\r\n? ).+)+ 换行符或换行符加回车最多匹配一次。

每个字符都在非捕获组之外匹配,不包括行终止符。 尽可能多地执行此过程。

示例代码:

import re as regex
data = """Regex In Python
Regex is a feature available in all programming languages used to find patterns in text or data.
"""
query=regex.compile(r"^(.+?)\n([\a-z]+)",regex.MULTILINE)
for match in query.finditer(data):
    topic, content = match.groups()
    print ("Topic:",topic)
    print ("Content:",content)

输出:

Topic: Regex In Python
Content: 
Regex is a feature available in all programming languages used to find patterns in text or data.

上面的表达式可以解释如下:

在第一个捕获组 (.+?) 中,尽可能少地匹配所有字符(除了行终止符,和以前一样)。 之后,匹配单个换行符 \n

匹配换行符后,在第二个捕获组 (\n[a-z ]+) 中进行如下操作。 首先,匹配换行符,然后尽可能多次匹配 a-z 之间的字符。

使用 re.findall() 在 Python 中匹配多行文本块

示例代码:

import re as regex
data = """When working with regular expressions, the sub() function of the re library is an invaluable tool.
the subroutine looks over the string for the given pattern and applies the given replacement to all instances where it is found.
"""
query = regex.findall('([^\n\r]+)[\n\r]([a-z \n\r]+)',data)
for results in query:
    for result in results:
        print(result.replace("\n",""))

输出:

When working with regular expressions, the sub() function of the re library is an invaluable tool.
the subroutine looks over the string for the given pattern and applies the given replacement to all instances where it is found

为了更好地理解正则表达式的解释,让我们按每个组对其进行分解,看看每个部分的作用。

在第一个捕获组 ([^\n\r]+) 中,尽可能多地匹配所有字符,不包括换行符或回车符。

之后,当字符是表达式 [\n\r] 中的回车符或换行符时进行匹配。

在第二个捕获组 ([a-z \n\r]+) 中,a-z 或换行符或回车符之间的字符尽可能多地匹配。

到此这篇关于Python - 匹配多行文本块的正则表达式的文章就介绍到这了,更多相关python正则表达式匹配多行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python原始套接字编程示例分享

    python原始套接字编程示例分享

    在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互。因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送。使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的限制。
    2014-02-02
  • python PyAutoGUI实现自动化鼠标键盘等常用操作

    python PyAutoGUI实现自动化鼠标键盘等常用操作

    这篇文章主要介绍了python PyAutoGUI实现自动化鼠标键盘等常用操作使用实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 使用 Django 进行测试驱动开发

    使用 Django 进行测试驱动开发

    本文分享了什么是测试驱动开发,并用测试驱动开发的方式 创建了一个简单的 Django 应用程序,感兴趣的可以了解一下
    2021-11-11
  • Python类中使用cursor.execute()时语法错误的解决方法

    Python类中使用cursor.execute()时语法错误的解决方法

    在 Python 类中使用 cursor.execute() 时,出现语法错误(如 SyntaxError 或 SQL 语法相关错误)通常是因为 SQL 语句格式不正确、占位符使用不当,或参数传递方式不符合预期,以下是解决此类问题的常见方法和建议,需要的朋友可以参考下
    2024-09-09
  • 浅析Python如何实现Celery任务队列系统

    浅析Python如何实现Celery任务队列系统

    这篇文章主要为大家详细介绍了一个基于 Celery 和 Redis 的分布式任务队列系统,用于处理异步任务和定时任务,希望对大家有一定的帮助
    2025-04-04
  • 解决pyqt5中QToolButton无法使用的问题

    解决pyqt5中QToolButton无法使用的问题

    今天小编就为大家分享一篇解决pyqt5中QToolButton无法使用的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • tsv、csv、xls等文件类型区别及如何用python处理详解

    tsv、csv、xls等文件类型区别及如何用python处理详解

    近日在处理数据的时候发现有的文件为csv文件,有的为tsv文件,这篇文章主要给大家介绍了关于tsv、csv、xls等文件类型区别及如何用python处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • Python3使用Matplotlib 绘制精美的数学函数图形

    Python3使用Matplotlib 绘制精美的数学函数图形

    这篇文章主要介绍了Python3使用Matplotlib 绘制精美的数学函数图形,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Python时间序列缺失值的处理方法(日期缺失填充)

    Python时间序列缺失值的处理方法(日期缺失填充)

    这篇文章主要给大家介绍了关于Python时间序列缺失值(日期缺失填充)的处理方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 使用python对excel表格处理的一些小功能

    使用python对excel表格处理的一些小功能

    这篇文章主要介绍了使用python对excel表格处理的一些小功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论