Linux基础(15)/正则表达式

来源:互联网 发布:淘宝信用卡办理 编辑:程序博客网 时间:2024/06/05 05:33

Regex mindmap

本章是该Linux基础教程的最后一章。

正则表达式(regular expression)是一个很重要的概念,这个概念最初是由UNIX中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。,其应用并不局限与Linux。许多程序设计语言都支持利用正则表达式进行字符串操作。比如:

  • 我们想用Python批量处理文本信息,或者用Python制作爬虫在网络上收集信息时,必须要使用正则表达式。Python中甚至有一个模块re,专门存放了许多的有关正则表达式操作的函数。

  • Perl 内建了一个功能强大的正则表达式引擎PCRE。PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式)是一个用 C 语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE是一个轻量级的函数库,比Boost 之类的正则表达式库小得多。PCRE 十分易用,同时功能也很强大,性能超过了 POSIX 正则表达式库和一些经典的正则表达式库。

  • 在Linux中,grep,expr,sed,awk或Vi 等命令或程序经常会使用到正则表达式来检索、替换那些符合某个模式的文本。

总之,正则表达式内容丰富,技巧甚多,本节只介绍一些正则表达式最常用的语句,希望读者以此为基础,通过查询和阅读其他资料,更深入的学习正则表达式的相关内容,为以后的学习做好铺垫。

下面我们进入正式的学习。

  1. 什么是正则表达式?

    • 场景分析
      在讲述什么是正则表达式这个概念之前,我们先来看一个场景。
      在做数据处理和编程的过程中,我们经常要匹配字符串。比如,我有一个字符文本,我现在想在该文本中匹配出所有的含anran的字符串,那么怎么去匹配呢?
      首先,我们可以自己去写一个函数get_anran(),通过自定义的函数完成相应字符串操作。
      其次,我们可以看看有没有相应的库函数,通过调用库函数来解决问题。
      上述两种方法,都是想通过函数调用的方式解决问题。但是却都有一个缺陷,这种方法不直观,且笨重。不直观在于只看函数名,时间一久了,就容易忘记函数功能,这个时候这只能去看文档来回想这个函数到底是干什么用的。笨重在于,我如果想要稍微修改一下匹配功能,函数代码就要大改,这样太耗时了。

      那问题来了,有没有一种好的方法,能够简介高效的匹配字符串呢?
      答案就是:正则表达式

    • 定义
      正则表达式就是利用特殊字符,高效处理字符串的一种规则。 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

    • 与通配符的比较
      举个例子,现在有一个表达式anran*。
      如果它是一个通配符,那么它能匹配开头为anran后面为任意字符的字符串。在Linux命令行下,我们使用的是通配符。
      如果它是一个正则表达式,那么它只能匹配开头为anran,后面的字符只能从字符串anran中的挑选出来,且字符之间的相对顺序不变。比如anran,anrann,anrananran,anranran,anranan等等。
      所以正则表达式虽然和通配符很像,但是在某些方面差别是很大的。

  2. 基本语法
    一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。

    下面列举一些常用的作为 PCRE 子集的适用于perl和python编程语言及grep或egrep的正则表达式匹配规则

    char description \ 将下一个字符标记为一个特殊字符、或一个原义字符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。序列“\”匹配“\”而“(”则匹配“(”。 ^ 匹配输入字符串的开始位置。 $ 匹配输入字符串的结束位置。 {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}。 ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。 . 匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“(.|\n)”的模式。 (pattern) 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“(”或“)”。 x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。 [xyz] 字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果如果出现在首位则仅作为普通字符。 [^xyz] 排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。 [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。 [^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。

    优先级: 从上到下从左到右,依次降低

    char description \ 转义符 (), (?:), (?=), [] 括号和中括号 *、+、?、{n}、{n,}、{n,m} 限定符 ^、$、\任何元字符 定位点和序列 | 选择

    简单梳理一下上述语法规则,包含:
    转义\选择|,定位点^$,小括号(),中括号[],大括号{,},限定符?+*。
    思维导图如下:
    RegularExpression

  3. 在Linux上的应用
    主要分为三个部分分别为正则表达式在grep,sed,awk三个程序上的应用。

    1. grep

    2. sed

    3. awk


扩展学习:
wiki–regular expression
正则表达式30分钟入门教程

0 0
原创粉丝点击