vlambda博客
学习文章列表

正则表达式简介及应用示例

摘要:正则表达式(regular expression)是使用单个字符串来描述、匹配一系列符合某种句法规则的字符串。本文将简要介绍正则表达式的应用环境、语法并展示应用示例。



  前言 


正则表达式是什么

本文将简要介绍正则表达式的应用环境、语法并展示应用示例。


  一   正则表达式的应用环境


正则表达式在多数编程语言中都有部署(例如C#、Perl、PHPPython等等)、在各种数据库软件中(例如 OracleMySQL等等)一般由类似regexp_like/REGEXP的函数支持、在Office及一些文本编辑器中(例如Notepad++UltraEditor等等)也有部署。下图显示的是在Notepad++中设定正则表达式并进行文本替换的方法。

不同编程语言及应用场景中正则表达式的写法大体思路一致,细节上可能存在差异,需结合场景调试。


  二   正则表达式语法


正则表达式是由普通字符(例如字符 a z数字0-9等等)以及特殊字符(称为"元字符 meta character")组成的文字模式描述在搜索文本时要匹配的一个或多个字符串。匹配字符串的过程从左至右进行。

绝大多数普通字符在匹配就是匹配字符本身比如 'A', 'a', 或者 '0',都是最简单的正则表达式,也可以拼接普通字符,例如 last 匹配字符串 'last';特殊字符则包含特殊含义。常见的特殊字符有{}[]^$.|*+?以及\,其中\(反斜杠)提供转义功能。转义字符可帮助查询特殊字符本身,同时与bdswBDSWn等字母连用时也具有特殊含义。

特殊字符的描述请见下表:

特殊字符

描述

.

点号匹配除了换行符的任意单个字符

[ ]

匹配方括号内的任意字符,常见[0-9]匹配数字[a-z]匹配小写字母

[^ ]

否定的字符种类。匹配除了方括号里的任意字符

*

匹配>=0个重复的在*号之前的字符

+

匹配>=1个重复的在+号前的字符

?

标记?之前的字符为可选.

{n,m}

匹配NM个大括号之前的字符

|

逻辑判断中的“或”运算符,匹配符号前或后的字符

\

转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ |

^

从开始行开始匹配

$

从末端开始匹配

\b

匹配一个单词边界,也就是指单词和空格间的位置

\B

匹配非单词边界

\w

匹配所有字母数字,等同于:[a-zA-Z0-9_]

\W

匹配所有非字母数字,即符号,等同于:[^\w]

\d

匹配数字,等同于:[0-9]

\D

匹配非数字,等同于:[^\d]

\s

匹配所有空格字符,等同于:[\t\n\f\r\p{Z}]

\S

匹配所有非空格字符,等同于:[^\s]

\n

匹配一个换行符

下图展示的一个基于上述特殊字符构造的一个正则表达式及其含义。可匹配基于Unicode编码的长度为5的中文字符串,例如“罗小黑战记”、“正则表达式”等等。

正则表达式简介及应用示例

除上述特殊字符支持的功能外正则表达式还提供分组、零宽断言等诸多功能,这里不做过多展开,在示例中会稍作展示。


  三   正则表达式应用


本文中的应用示例Python展示, Pythonre 模块拥有全部的正则表达式功能,使用前用import re进行调用。示例中会使用到re.searchre.findall两个函数:  

re.search(pattern,string)会扫描整个string查找匹配,会扫描整个字符串并返回第一个成功的匹配。当不需要获取全部结果,只需检测是否有符合条件的字符串时,使用re.search可以较快得到结果; re.findall(pattern,string)将返回一个所匹配的字符串的字符串列表

以下为一些正则表达式的应用示例:

例1:在进行文本匹配时,很多时候我们并不清楚可以匹配的结果是什么样的字符,可能是数字、英文、中文等等。特殊字符. 是正则表达式中非常常用的一个字符,可以完成这种模糊匹配的需求,用来替代除了换行符外的任意字符。一个.代表一个字符,可多个连用,'.....'表示五个字符。此例中展示了如何使用.进行任意字符串匹配并输出匹配结果。

正则表达式简介及应用示例
例2:当我们需要判断某些特定关键词是否出现在字符串,却不知道该关键词在字符串中出现了几次时,可以+来进行匹配。下例中的 毕+ 可以匹配 毕毕毕 毕毕 等多种包含 的字符串。
正则表达式简介及应用示例
3:当我们只知道字符串的一部分信息(例如知道字符串的开头、结尾、中间包含的特殊值,其余信息不确定时)可以使用. * 来替代不限长度的任意字符完成模糊匹配。下例中的 a. *’ 可以匹配出 ’a’ ’aa’ ’abc’ a安安 等诸多包含 a 的字符串。
正则表达式简介及应用示例
4:正则表达式中支持逻辑判断,|表示逻辑或,当我们需要匹配ab时可以用 a|b 来表示。下例中的 [||]..站’ 可以匹配出南ab站、东cd站、北hh站等任意以东、北、南开头以站结尾的四字字符串。
正则表达式简介及应用示例
例5:从文本中提取数字也是正则表达式中的常规操作。\ d 表示一位数字取值在0-9区间数值不限,\ d+ 可以提取任意长度的数字。下例中使用\ d+ 提取出文本中所有的数字信息。
正则表达式简介及应用示例
6 :正则表达式中 {} 符号可以限定前面字符出现的次数。手机号是日常生活中的常见数据,一般以 1 开头号段在 13 19 区间长度总共为 11 位。有些时候人们会在填写手机号的时候加上前面的区号,例如 +86 ,有些则不会添加,都被视为个是正常的手机号。下例中展示使用正则表达式匹配长度为 11 位号段在 13-19 区间, +(86) 选填的手机号。
正则表达式简介及应用示例
7: 当我们需要从一个字符串中提取多个结果时可以利用正则表达式的分组功能。 一般情况下可以通过身份证号获取个人出生省市及生日等信息,下例中展示将示例身份证号进行分组抽取并存储的过程。
正则表达式简介及应用示例
用好正则表达式需要很多练习,在这里推荐一个正则表达式测试网站 https://regex101.com/ 可以在线进行交互式正则表达式测试。支持多语言、在线测试表达式效果并提供一定程度的解释,具体效果如下图所示:


参考资料:

(1)余晟 著. 正则指引(2),电子工业出版社,2018.ISBN: 9787121351303

(2) https://docs.python.org/zh-cn/3/library/re.html

(3)https://github.com/ziishaned/learn-regex

(4) https://tool.oschina.net/uploads/apidocs/jquery/regexp.html

(5)https://www.runoob.com/python/python-reg-expressions.html






长按二维码即可关注!也请随手推荐我们给你的小伙伴 ↓↓↓↓