『正则表达式』概念 及在grep、awk、sed、C语言、Python中的简单应用

简介: 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式。它可以用来检查一个字符串是否符合某个规则,或者从一个字符串中提取出符合某个规则的子串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。

目录

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式。它可以用来检查一个字符串是否符合某个规则,或者从一个字符串中提取出符合某个规则的子串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。

一、元字符

正则表达式语法中使用的主要元字符包括:

  • . (点):匹配除换行符以外的任意字符。
  • ^ (脱字符):匹配输入字符串的开始位置。
  • $ (美元符号):匹配输入字符串的结束位置。
  • *(星号):匹配前面的子表达式零次或多次。
  • +(加号):匹配前面的子表达式一次或多次。
  • ? (问号):匹配前面的子表达式零次或一次。
  • {n}:n 是一个非负整数。匹配确定的 n 次。
  • {n,}:n 是一个非负整数。至少匹配 n 次。
  • {n,m}:m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。
  • […]:字符集合。匹配方括号中包含的任意字符。
  • [^…]:负值字符集合。匹配方括号中不包含的任意字符。


还有:

  1. “|”:或,匹配左右两边任意一个表达式
  2. “”:转义字符,用于转义特殊字符,使其具有原本的字符意义,例如匹配字符".“,需要使用”.“而不是”."。
  3. “\d”:匹配数字,相当于字符集[0-9]。
  4. “\D”:匹配非数字字符,相当于字符集[^0-9]。
  5. “\w”:匹配单词字符,包括数字、字母和下划线,相当于字符集[A-Za-z0-9_]。
  6. “\W”:匹配非单词字符,相当于字符集[^A-Za-z0-9_]。
  7. “\s”:匹配空白字符,包括空格、制表符和换行符等。
  8. “\S”:匹配非空白字符。
  9. “(?=exp)”:前向肯定断言,匹配exp前面的位置。
  10. “(?!exp)”:前向否定断言,匹配非exp前面的位置。


二、常用正则表达式

使用正则表达式往往比我们写几行if-else这样的代码更加方便,以下是一些常用的正则表达式的参考(写法不唯一,且规则因国家、地区、开发语言而异):

1.匹配邮箱地址:

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

2.匹配手机号码:

/^1([3-9])\d{9}$/

3.匹配固定电话号码:

/^\d{3}-\d{8}|\d{4}-\d{7}$/

4.匹配身份证号码:

/^\d{17}[\d|X|x]|\d{15}$/

5.匹配日期格式(yyyy-mm-dd):

/^\d{4}-\d{1,2}-\d{1,2}$/

6.匹配中文字符:

/[\u4e00-\u9fa5]/

7.匹配URL地址:

/^((http|https):\/\/)?([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?$/

8.匹配邮政编码:

/^[1-9]\d{5}$/

9.匹配IP地址:

/^((\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])$/

10.匹配HTML标签:

/^<[^>]+>$/

11.匹配正整数:

/^[1-9]\d*$/

12.匹配负整数:

/^-\d+$/

13.匹配正数(包括小数):

/^\d+(\.\d+)?$/

14.匹配非正数(包括小数):

/^((-\d+(\.\d+)?)|(0+(\.0+)?))$/

15.匹配非负数(包括小数):

/^\d+(\.\d+)?|0+(\.0+)?$/

16.匹配16进制颜色值:

/^#([0-9a-fA-f]{3}|[0-9a-fA-F]{6})$/

17.匹配密码强度(至少包含大写字母、小写字母、数字和特殊字符,长度至少为8位):

/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@$!%*?&)])[A-Za-z\d@$!%*?&]{8,}$/

18.匹配车牌号码:

/^[A-Z]{1}[A-Z_0-9]{5}$/

19.匹配域名:

/^([a-zA-Z0-9][-a-zA-Z0-9]{0,62}\.){1,}[a-zA-Z]{2,}$/

20.匹配时间格式(hh:mm:ss):

/^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$/

三、使用示例

3.1 在 grep、awk、sed中使用正则表达式

正则表达式和grep、awk、sed非常搭配。

例1: 使用grep匹配html文件中含有中文字符的行,并打印行号

 grep -nP '[\x{4e00}-\x{9fa5}]' index.html

d637922e984b2f13cc55b1b43bdfd5b4_8880428788b94be1aa546ea5a96c5c49.png

在grep中,使用Unicode字符范围来匹配中文需要使用16进制表示法,[\u4e00-\u9fa5]可以写成[\x{4e00}-\x{9fa5}]

例2: 使用awk匹配html文件中的块级标签:

awk '/^</' index.html

cd7e69ff75255263a83a55a3903df615_83664861053d483995d49d8703bdf798.png

例3:匹配html文件中的函数,并显示他们所在的行数

dahu@dahu MINGW64 ~/Desktop/gpt
dahu@dahu MINGW64 ~/Desktop/gpt
$ awk '/function/{print NR,$0}' index.html
145         function ask() {
247         function addText(text) {
251         function removeLine() {
257         function setCookie(name, value) {
269         function getCookie(name) {
279         function clear1() {


例4: 使用sed匹配含有response的行:

$ sed -n '/response/p' index.html
            ).then(response => {
                let resultstring = response.data.choices[0].message.content;
                let resultname = response.data.choices[0].message.role;

3.2 在Python中使用正则表达式

可以使用Python的内置re模块来使用正则表达式。

re模块提供了Perl风格的正则表达式模式,使Python语言拥有全部的正则表达式功能。常用的正则表达式函数有:re.search()re.match()re.findall()re.sub()等。

  • re.search():在字符串中查找模式,如果找到则返回Match对象,否则返回None。
  • re.match():从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
  • re.findall():在字符串中查找模式,返回所有匹配到的字符串。
  • re.sub():用于替换字符串中的匹配项。


例5: 判断输入手机号是否正确

import re
def judge_phone_number(account):
    pattern = re.compile(r"^1([3-9])\d{9}$")
    if pattern.match(account):
        print("手机号码输入正确")
    else:
        print("手机号码输入错误")
judge_phone_number(input("请输入手机号:"))

7513c1e78307bb572ff985519e570864_98a1f3aa5af34f7d86d4a0bc0fc610ae.png

注:

Python个中的正则表达式放在单、双引号里面,前面加一个r表示原始字符串,不进行转义。

正则表达式一般放在//里面,不同语言有一些区别。

3.3 在C语言中使用正则表达式

在C语言中,可以使用POSIX标准库中的正则表达式库regex.h来编写和处理正则表达式。

C语言中处理正则表达式的函数有regcomp()regexec()regfree()regerror()等。

3.31 函数介绍

  • regcomp()函数:编译正则表达式。函数原型如下:
int regcomp(regex_t *preg, const char *regex, int cflags);

其中,preg是一个指向regex_t类型的指针,regex是一个指向正则表达式字符串的指针,cflags是编译标志。如果函数执行成功,返回值为0;否则,返回值为非0。

  • regexec()函数:执行匹配。函数原型如下:
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);

其中,preg是一个指向regex_t类型的指针,string是一个指向待匹配字符串的指针,nmatch是pmatch数组的长度,pmatch是一个指向regmatch_t类型的数组,eflags是执行标志。如果函数执行成功,返回值为0;否则,返回值为非0。

  • regfree()函数:释放内存。函数原型如下:
void regfree(regex_t *preg);

其中,preg是一个指向regex_t类型的指针。

  • regerror()函数:获取包含错误信息的字符串。函数原型如下:
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

其中,errcode是错误代码,preg是一个指向regex_t类型的指针,errbuf是一个指向字符数组的指针,errbuf_size是字符数组的长度。如果函数执行成功,返回值为错误信息字符串的长度;否则,返回值为0。

3.32 例程

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>
int main (void)
{
    char ebuff[256];
    int ret;
    int cflags;
    regex_t reg;
    cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;
    char *test_str = "Hello World";
    char *reg_str = "H.*";
    ret = regcomp(&reg, reg_str, cflags);
    if (ret)
    {   
        regerror(ret, &reg, ebuff, 256);
        fprintf(stderr, "%s\n", ebuff);
        goto end;
    }   
    ret = regexec(&reg, test_str, 0, NULL, 0);
    if (ret)
    {
        regerror(ret, &reg, ebuff, 256);
        fprintf(stderr, "%s\n", ebuff);
        goto end;
    }   
    regerror(ret, &reg, ebuff, 256);
    fprintf(stderr, "result is:\n%s\n", ebuff);
end:
    regfree(&reg);
    return 0;
}

4e4b2f946df2354b703b9899195ecaab_6afb7f79247e485ca74cc94c1d5b8518.png


相关文章
|
8月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
686 1
|
10月前
|
存储 编译器 程序员
C语言常见概念
C语言是一门基础的编程语言,通过编译器将源代码转换为计算机可执行的二进制程序。本文介绍了C语言的基本概念,包括其作为人与计算机交流的工具、编译与链接的过程、常用编译器的选择(如VS2022)、main函数的作用、库函数与关键字、字符与ASCII编码、字符串与转义字符等内容。同时,还讲解了如何在VS2022中创建C语言项目、编写第一个程序,以及常见的语法错误和调试方法。适合初学者了解C语言核心概念与开发环境搭建。
670 1
|
存储 数据挖掘 数据库
探索Python编程:从基础到高级探索移动应用开发之旅:从概念到实现
【8月更文挑战第29天】本文将带你进入Python的世界,无论你是初学者还是有一定经验的开发者。我们将从Python的基础知识开始,然后逐步深入到更复杂的主题。你将学习到如何编写清晰、高效的代码,以及如何使用Python进行数据分析和网络编程。最后,我们将介绍一些高级主题,如装饰器和生成器。让我们一起开始这段旅程吧!
|
Unix 编译器 C语言
[oeasy]python052_[系统开发语言为什么默认是c语言
本文介绍了C语言为何成为系统开发的首选语言,从其诞生背景、发展历史及特点进行阐述。C语言源于贝尔实验室,与Unix操作系统相互促进,因其简洁、高效、跨平台等特性,逐渐成为主流。文章还提及了C语言的学习资料及其对编程文化的影响。
196 5
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
593 8
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
898 5
|
测试技术 Python
探索Python中的装饰器:从基础概念到高级应用
本文深入探讨了Python中一个强大而灵活的特性——装饰器。从其基本定义出发,逐步解析装饰器的本质、运作机制以及如何高效利用这一工具来优化代码结构、增加功能和提升代码的可读性与可维护性。通过具体示例,包括自定义简单装饰器、带参数装饰器、多重装饰等高级话题,本文展示了装饰器在软件开发中的广泛应用,旨在为读者提供一个全面而实用的装饰器使用指南。
|
前端开发 JavaScript 数据可视化
Python+Dash快速web应用开发——基础概念篇
Python+Dash快速web应用开发——基础概念篇
736 3
|
JSON C语言 数据格式
Python导出隐马尔科夫模型参数到JSON文件C语言读取
Python导出隐马尔科夫模型参数到JSON文件C语言读取
266 1