正则表达式:文本处理的利器

正则表达式:文本处理的利器

文章目录

      • 正则表达式:文本处理的利器
        • 正则表达式的核心组件
        • 正则表达式的高级用法
        • 正则表达式的实际应用示例
        • 正则表达式的性能优化
        • 更多正则表达式示例
        • 笔记获取
        • 参考资料

在机器学习中,熟练使用正则表达式是处理和解析文本数据的利器。正则表达式(Regular Expressions,简称 Regex)是一种强大的文本匹配工具,可以帮助我们在海量数据中快速找到我们想要的信息。

正则表达式的概念最早由美国数学家斯蒂芬·科尔·克莱尼(Stephen Cole Kleene)在1950年代提出,用于描述神经网络的数学模型。随着时间的推移,正则表达式的概念被引入计算机科学,尤其是在文本处理和数据检索领域中发挥了巨大作用。它们被广泛应用于Unix工具中,如sed、grep和awk,成为编程和数据分析中不可或缺的工具。

正则表达式的核心组件

正则表达式由一系列字符和符号组成,每个符号都有特定的含义。以下是一些最基本的组件:

  • 字面字符

    字面字符是正则表达式中直接用来匹配文本中相同字符的。例如,表达式 cat 可以匹配字符串 “He found a cat.” 中的 “cat”。

  • 元字符:元字符在正则表达式中有特殊含义

    • .:匹配除换行符以外的任何单个字符。例如,a.c 可以匹配 “abc”、“axc”、“a c”。
    • ^:匹配输入字符串的开始。例如,^Hello 匹配以 “Hello” 开头的任何字符串。
    • $:匹配输入字符串的结尾。例如,world$ 匹配以 “world” 结尾的任何字符串。
  • 字符类:使用方括号定义的一组字符,匹配这组字符中的任意一个字符。

    • [abc]:匹配 “a”、“b” 或 “c”。例如,在 “apple” 中,可以匹配到 “a”。
  • 预定义字符类:这些是常见的字符类的简写形式。

    • \d:匹配任何数字。它相当于 [0-9]。例如,\d\d 可以匹配 “42”。
    • \w:匹配任何字母数字字符(包括下划线)。相当于 [a-zA-Z0-9_]。例如,\w\w 可以匹配"a9"、“3_”。
    • \s:匹配任何空白字符(包括空格、制表符、换行符等)。例如,hello\sWorld 匹配 “hello World”。
  • 量词:这些符号用来指定一个元素出现的次数。

    • *:匹配前面的元素零次或多次。例如,bo* 可以匹配 “b”、“bo”、“boo”、“booo” 等。
    • +:匹配前面的元素一次或多次。例如,a+ 可以匹配 “a”、“aa”、“aaa” 等。
    • ?:匹配前面的元素零次或一次。例如,colou?r 可以匹配 “color” 或 “colour”。
正则表达式的高级用法
  • 贪婪与非贪婪匹配:正则表达式默认采用贪婪匹配,尽可能多地匹配字符。通过在量词后添加 ?,可以实现非贪婪或最小匹配。

  • 分组与后向引用:使用 () 对模式进行分组,可以通过 \1\2 等引用这些分组捕获的文本。

    • 例子:匹配日期格式,如 “2023-05-11” 和 “2023/05/11” 可以互相转换。
    (\d{4})[-/](\d{2})[-/](\d{2})
    

    使用后向引用来转换格式:

    替换为 \1/\2/\3 或 \1-\2-\3
    

    在替换操作中,你可以使用 \1\2\3 来引用这些分组捕获的内容:

    • \1 引用第一个分组(年份)。
    • \2 引用第二个分组(月份)。
    • \3 引用第三个分组(日期)。

    替换格式可以是:

    • 使用斜杠分隔:\1/\2/\3,把 2023-05-11 转换为 2023/05/11
    • 使用短横线分隔:\1-\2-\3,把 2023/05/11 转换为 2023-05-11
  • 断言:不消耗字符的特殊结构,如正向前瞻 (?=...) 和负向前瞻 (?!...)

    • 正向前瞻(Positive Lookahead):
    (?=...)
    

    断言后面的字符满足某种模式。**例子:**匹配后面跟着数字的字母。

    \w(?=\d)
    
    • 负向前瞻(Negative Lookahead):
    (?!...)
    

    断言后面的字符不满足某种模式。例子:匹配后面不跟数字的字母。

    \w(?!\d)
    
正则表达式的实际应用示例
  1. 验证电子邮件地址:

    ^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
    

    这个正则表达式可以匹配大部分电子邮件地址。

  2. IP地址匹配:

    ^\d{1,3}(\.\d{1,3}){3}$
    

    用于匹配标准的IPv4地址。此表达式确保每个数字块介于0到255之间,是IPv4地址规范的关键组成部分。

  3. 自然语言处理

    在文本分析和自然语言处理(NLP)中,正则表达式尤其显示出其强大的功能。例如,在进行情感分析或主题识别之前,通常需要清洗和预处理文本数据,以提高模型的准确性和效率。

    示例:提取特定信息

    假设我们需要从一系列的推文中提取所有提到的用户名(以@开头的词)。可以使用如下正则表达式来实现:

    @[a-zA-Z0-9_]+
    

    此表达式匹配任何以@符号开头,后跟任意数量的字母、数字或下划线的字符串。

    Python代码示例:

    import retweets = ["Hello from @user1", "Updates by @user2: Check this out!", "@user3 @user4 are on the move!"]
    usernames = [re.findall(r"@[a-zA-Z0-9_]+", tweet) for tweet in tweets]
    print(usernames)
    

    输出结果:

    [['@user1'], ['@user2'], ['@user3', '@user4']]
    

    这个简单的例子展示了如何使用正则表达式快速提取和分析社交媒体数据。

  4. 综合示例:数据分析

    假设我们有一份文本数据,包含多个日期格式,我们需要统一这些日期的格式。使用正则表达式,我们可以轻松地识别各种日期格式,并将它们转换为标准格式。

    原始文本:

    John's birthday: 12-05-1997, Anniversary: 03 March 1999, New Year: 01/01/2020
    

    正则表达式匹配与替换:

    import retext = "John's birthday: 12-05-1997, Anniversary: 03 March 1999, New Year: 01/01/2020"
    # 正则表达式识别不同的日期格式
    date_patterns = [r'(\d{2})-(\d{2})-(\d{4})',  # 匹配 DD-MM-YYYYr'(\d{2}) (\w+) (\d{4})',    # 匹配 DD Month YYYYr'(\d{2})/(\d{2})/(\d{4})'   # 匹配 DD/MM/YYYY
    ]# 统一日期格式为 YYYY-MM-DD
    for pattern in date_patterns:text = re.sub(pattern, r'\3-\1-\2', text)print(text)
    

    输出结果:

    John's birthday: 1997-12-05, Anniversary: 1999-03-March, New Year: 2020-01-01
    

    这个例子展示了正则表达式在数据清洗过程中的实际应用,如何从混乱的数据中提取信息并将其标准化。

正则表达式的性能优化

正则表达式虽然功能强大,但在处理大规模数据时可能会遇到性能瓶颈。优化正则表达式的关键在于使用非贪婪匹配、准确的字符类和有效的定位锚点减少回溯。

优化示例:

考虑以下正则表达式,用于从文本中提取所有括号内的内容,包括嵌套的括号:

\(([^()]*|(?R))*\)

这个表达式使用了递归匹配((?R)),在某些正则表达式引擎中支持,如PCRE。它能够匹配如 (a(b)c) 的嵌套结构。

更多正则表达式示例
描述正则表达式示例
整数匹配^-?\d+$-123, 456
浮点数匹配^-?\d*(\.\d+)?$-1.23, 4.56
电子邮件地址验证^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$example@domain.com
URL验证`^(https?ftp)😕/[^/\s]+/\S+$`
日期格式(YYYY-MM-DD)^\d{4}-\d{2}-\d{2}$2020-01-01
IPv4地址匹配^(\d{1,3}\.){3}\d{1,3}$192.168.1.1
强密码验证^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$Password1
十六进制颜色代码`^#?([a-f0-9]{6}[a-f0-9]{3})$`
HTML标签匹配<(\w+)([^>]*?)>(.*?)<\/\1><a href="#">link</a>
括号内的内容\(([^)]+)\)(content)
日志文件特定数据提取^\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}\s+\[\w+\]\s+(.*)2020-01-01 12:00:00 [INFO] Example message
笔记获取

点击文末名片,到公号回复“正则表达式”领取。

参考资料
  1. Regular expression
  2. Regular Expressions (Regex)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/835565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin基本特性

目录 函数 if when 循环 面向对象 继承 主构造函数 接口 修饰符 ​编辑数据类 单例类 Lambda编程 集合 lambda用法 常见函数式API 空指针 判空辅助工具 字符串内嵌表达式 函数 fun add1(a:Int,b:Int):Int{return ab }fun add2(a:Int,b:Int):Int ab // 只…

CVPR 2024|多模态场景感知,高保真运动预测框架来了!

设想一下&#xff0c;你在家中准备起身&#xff0c;前往橱柜取东西。一个集成 SIF3D 技术的智能家居系统&#xff0c;已经预测出你 的行动路线&#xff08;路线通畅&#xff0c;避开桌椅障碍物&#xff09;。当你接近橱柜时&#xff0c;系统已经理解了你的意图&#xff0c;柜门…

代码随想录35期Day35-Java

Day35题目 LeetCode435.无重叠区间:移除几个元素,使得不重叠 核心思想:排序区间之后,如果重叠,更新下一个区间的右边界为最小值.如果重叠了,最少移除其中一个,更新移除的那个为最小的右边界之后就不会影响到之后的区间判断 class Solution {public int eraseOverlapInterval…

无限集中的最小数字

题目链接 无限集中的最小数字 题目描述 注意点 1 < num < 1000 解答思路 由题意得&#xff0c;可以理解为最初集合中有1~1000之间的所有数字&#xff0c;如果集合中存在数字&#xff0c;则添加时不会有任何操作&#xff1b;在移除集合中的元素时&#xff0c;会按顺序…

表格内容高效拆分,自定义行数随心所欲,让数据处理更高效!

在信息化社会的今天&#xff0c;表格成为了我们处理数据、整理信息的重要工具。然而&#xff0c;当表格内容过于庞大时&#xff0c;如何高效地拆分表格内容成为了摆在我们面前的一大难题。传统的拆分方法往往耗时耗力&#xff0c;且难以满足我们个性化的需求。 首先&#xff0…

视频号创作分成计划实战指南:保姆级教程,带你玩转新副业

视频号的月活跃用户数量已在去年突破了8亿大关&#xff0c;并且不断增长。 在这篇文章中&#xff0c;我将与大家分享视频号的运营玩法和作品创作方向。 一、玩法流程 开通条件 要开通创作者分成计划功能&#xff0c;需要满足以下条件&#xff1a; 粉丝数量达到100及以上。 …

【优选算法】——Leetcode——611. 有效三角形的个数

目录 ​编辑 1.题目 2 .补充知识 3.解法⼀&#xff08;暴⼒求解&#xff09;&#xff08;可能会超时&#xff09;&#xff1a; 算法思路&#xff1a; 算法代码&#xff1a; 4.解法⼆&#xff08;排序双指针&#xff09;&#xff1a; 算法思路&#xff1a; 以输入: nums …

Java虚拟机(JVM)中确保资源及时释放的策略

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;内存管理主要是通过垃圾回收&#xff08;Garbage Collection, GC&#xff09;来自动处理的。Java开发者通常不需要&#xff08;也不应该&#xff09;显式地释放对象内存&#xff0c;因为JVM的垃圾回收器会自动处理不再使…

k8s各个组件的作用

Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化计算机容器化应用程序的部署、扩展和管理。以下是 Kubernetes 中的关键组件及其作用&#xff1a; API 服务器&#xff08;API Server&#xff09;&#xff1a; 作为集群中所有资源操作的入…

Android OpenMAX(五)高通OMX Core实现

上一节了解了OMX Core提供的内容,这一节我们看看高通OMX Core是如何实现的。本节代码参考自: omx_core_cmp.cpp registry_table_android.c qc_omx_core.h 1、OMX_Init/OMX_Deinit OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init() {DEBUG_PRINT(

Linux专题-Makefile(2)

本文主要分析Uboot的主Makefile 1.版本号 VERSION 1 PATCHLEVEL 3 SUBLEVEL 4 EXTRAVERSION U_BOOT_VERSION $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) VERSION_FILE $(obj)include/version_autogenerated.h这里需要注意最后一行&#xff0c;使用$(obj)解引…

跨平台移动应用开发指南:打造跨越iOS和Android的移动应用

跨平台移动应用开发已经成为许多开发者的首选&#xff0c;因为它可以节省时间、成本和精力&#xff0c;同时使得应用能够覆盖更广泛的用户群体。本指南将介绍跨平台移动应用开发的基本概念、流行的跨平台框架以及一些最佳实践&#xff0c;帮助您快速入门并打造出高质量的跨平台…

文本三剑客grep与正则表达式、元字符

正则表达式 正则表达式又称为正规表达式、常规表达式、在代码中常简写为regex、regex或RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串&#xff0c;简单来说&#xff0c;是一种匹配字符串的方法&#xff0c;通过一些特殊符号&#xff0c;实现快速查…

JetsonNano —— 2、对Nano板卡刷机后进行基础配置

说明 在完成上一节 “JetsonNano —— 1、Windows下对Nano板卡烧录刷机&#xff08;官方教程&#xff09;” 后&#xff0c;对新系统进行一些基础配置&#xff0c;以便使用更得心应手么。 基础配置 1、通过SSH连接Nano SSH是一种网络协议&#xff08;默认的端口号为22&#xff…

测试用例设计方法之因果图详解

一、因果图概述 因果图是从需求中找出因&#xff08;输入条件&#xff09;和果&#xff08;输出或程序状态的改变&#xff09;&#xff0c;通过分析输入条件之间的关系&#xff08;组合关系、约束关系等&#xff09;及输入和输出之间的关系绘制出因果图&#xff0c;再转化成判…

C++中的异常处理方式

目录 一、异常 二、C语言中对错误的处理 三、C中的异常处理 四、异常的抛出和捕获 五、异常的重新抛出 六、C标准库中的异常体系 七、异常的规范 一、异常 在C中&#xff0c;异常是程序运行期间发生的意外或错误情况。这些情况可能会导致程序无法继续正常执行&#xff0c;…

二维视觉尺寸测量简单流程

代码示例&#xff1a;opencv实战---物体尺寸测量_opencv尺寸测量精度-CSDN博客 灰度化 简化图像处理&#xff1a;灰度图像只包含亮度信息&#xff0c;不包含颜色信息&#xff0c;因此数据量比彩色图像小&#xff0c;处理起来更加简单和快速。这对于需要实时处理大量图像数据的场…

XTuner笔记

为什么要微调&#xff1a; 1. 模型不具备一些私人定制的知识 2。模型回答问题的套路你不满意。 对应衍生出来两种概念 增量预训练微调&#xff1a; 使用场景&#xff1a;让基座模型学习到一些新知识&#xff0c;如某个垂类领域的常识训练数据&#xff1a;文章、书籍、代码等…

Mac电脑安装打开APP显示问题已损坏 问题解决

当MAC电脑安装完软件打开时&#xff0c;显示文件已损坏&#xff0c;无法打开。搜了很多教程终于找到解决方案&#xff0c;记录下方便以后再用。 我的mac电脑是intel芯片的&#xff0c;如果你遇到这个问题&#xff0c;可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…

Python 框架安全:SSTI 模板注入漏洞测试.

什么是 SSTI 模板注入 SSTI (Server-Side Template Injection) 是一种Web应用程序安全漏洞&#xff0c;它发生在应用程序使用模板引擎渲染用户输入时。当应用程序将用户输入直接插入到模板中而不进行充分的过滤和验证时&#xff0c;就可能导致SSTI漏洞。攻击者可以利用这个漏洞…