正则表达式怎么用,正则表达式的使用

提起正则表达式,可能大家的第一印象是:既强大好用但也晦涩难懂。正则表达式在文本处理中相当重要,各大编程语言中均有支持(跟Linux三剑客结合更是神兵利器)。正则表达式是对字符串操作的一种逻辑公式,就是

提起正则表达式,可能大家的第一印象是:既强大好用但也晦涩难懂。正则表达式在文本处理中相当重要,各大编程语言中均有支持(跟 Linux 三剑客结合更是神兵利器)。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。(来自百度百科)个人理解如下:某个大佬为了从字符串中匹配或找出符合特定规律(如手机号、身份证号)的子字符串,先定义了一些通用符号来表示字符串中各个类型的元素(如数字用 \d 表示),再将它们组合起来得到了一个模板(如:\d\d模板就是指代两个数字),拿这个模板去字符串中比对,找出符合该模板的子字符串。由几个例子去进一步理解,比如现在有一个字符串为:1.test是一个正则表达式,它的匹配情况:I am a tester,and My job is to test some software. 它既可以匹配tester中的test,又可以匹配第二个test。正则表达式中的test就代表test这个单词本身。2.\btest\b是一个正则表达式,它的匹配情况:I am a tester,and My job is to test some software. 它只能匹配第二个test。因为\b具有特殊意义,指代的是单词的开头或结尾。故tester中的test就不符合该模式。3.test\w*是一个正则表达式,它的匹配情况:I am a tester,and My job is to test some software. 它匹配出了tester,也匹配出了第二个test。其中\w的意思是匹配字母数字下划线,表示的是数量,指有0个或多个\w。所以这个正则表达是的意思就是匹配开头为test,后续跟着0个及以上字母数字下划线的子字符串4.test\w+是一个正则表达式,它的匹配情况:I am a tester,and My job is to test some software. 它只匹配了tester。因为+与不同,+的意思是1个或多个,所以该正则表达式匹配的是开头为test,后续跟着1个及以上字母数字下划线的字符串。通过上述几个例子,应该可以看出正则表达式的工作方式,正则表达式由一般字符和元字符组成,一般字符就是例子中的‘test’,其指代的意思就是字符本身,t匹配的就是字母t;元字符就是例子中有特殊含义的字符,如\w,\b,*,+等。后续介绍一些基础的元字符。元字符有很多,不同元字符有不同的作用,大致可以分为如下几类。有些元字符专门用来指代字符串中的元素类型,常用的如下:

通过上述表格中的数据可以发现,\w,\d,\s都有一个与之相反的元字符(将对应字母大写后就是了)。\w匹配所有字母数字下划线,那么\W就是匹配所有不是字母数字下划线的字符。只要记住其中3个,另外3个就很好记了。乍一看这几个元字符挺简单的,但是经常不用的话保不准会忘记,此处分享一下我的记忆方法。我把这几个元字符都当作是某一个单词的缩写(虽然可能就是某个单词的缩写,但是没有找到准确的资料去印证):

正则表达式怎么用

\s是space(空间)的缩写

\d是digit(数字)的缩写

\w是word(可以理解成不是传统意义上的单词而是代码中的变量名,变量名可包含的元素就是字母数字下划线)的缩写好了,看到此处你应该已经熟记了6个元字符了。接下来,\n和\t平时会经常用到,这个肯定比较熟了,最后一个元字符‘.’可以理解它匹配一行中的所有元素,因为遇到换行符后就不再进行匹配了(万事万物源于一点)。有些元字符用于表示某种元素的数量,如\d表示一个数字,当你想表示6位数字怎么办?当然可以\d\d\d\d\d\d ,但确实太麻烦了,为了简便就需要一些表示数量的元字符,上述可以写成\d{6},元字符详情如下:

这几个元字符还算比较好记。表示0个或多个+表示1个或多个(这个可能会混淆,或许你可以这么记, 表示10=0或多个,+表示1+0=1或多个)?表示0或1个,可以理解成某个人在问你这个类型的元素有还是没有呀?你回答可能有(1)也可能没有(0)。剩下的三个只要记住大括号是用来表示数量,后续我们还会看到除了{}外,还有[]和()。它们各有各的作用。有些元字符没有具体的的匹配项,正则表达式的使用,它只是一个抽象的位置概念,它用来表示字符串中的各个位置。一个字符串的位置可以分成:字符串的开头或结尾、单词的开头或结尾。如字符串‘I am a tester_.’,I前面是字符串的开头位置,英文句号后面为字符串的结尾位置,每一个word(注意此处指的不是传统意义上的单词)前后的位置即为单词的开头或结尾,对于‘tester_’来说t前面是单词开头,下划线是单词结尾。

其中\b在前面的例子中有说过,此处可以以这种方式记忆:\b是block(块)的缩写,即一个单词是一块内容,\b是这一块的边界。至于另外两个元字符,暂时没找到很好的记忆方法(^一个尖角,小荷才露尖尖角?),但应该也不难记。此处有个地方要提及一下,所有表示位置的不会实际占用字符。为了理解可以继续看最上面的第二个例子,\btest\b最终匹配出来了子字符串“test”,而不是“ test ”。大家依据目前了解的元字符概念,可以思考一下这个正则表达式^\d{6,10}$,和\d{6,10}的区别。针对字符串‘12345678‘,第一个和第二个都可以匹配出’12345678‘。但是针对字符串’W12345678‘,只有第二个可以正确匹配出’12345678‘,原因在于第一个正则表达式的意思匹配一个字符串只有6-10个数字组成,而第二个正则表达式意思是匹配字符串中的6-10个连续数字。除了这三个元字符表示位置外,还有零宽断言、负向零宽断言也表示位置,后续会详细介绍。字符转义的概念大家肯定不陌生,对于,+等有特殊意义的元字符,假如你想匹配5个号应该怎么写,{5}吗?肯定不是,这样写是语法错误,应该使用\将其转义:*{5}。这样一来*的特殊意义就被\给取消了,想要匹配\的话,也是一样,再用一个\把特殊意义取消掉就好了。前面列出了部分用于表示意义的元字符,但是可能这几个元字符覆盖的都太广泛了,想要具体的匹配某一类字符。比如就是想匹配abcd这四个字符中的某一个,正则表达式当然也是支持的。这时候就需要用到第二种括号,中括号。匹配abcd中的某一个可以写成[abcd]或者[a-d],意思是匹配一个a-d中的任意字符。相反若匹配非abcd的任意字符,可以写成[^abcd],意思是匹配一个不是abcd的字符。括号内也可以写入不同类型的元素,如[a-d1-7@],表示的是匹配一个a-d或1-7或@中的任意字符,[^a-d1-7@]则与之相反讲完中括号后我们可以看一下小括号(),小括号的意思是分组,即小括号内部的所有元字符是一个整体。之前有学过表示数量的元字符,但是那个表示的数量都是针对于一个元字符来说的,比如ab+表示的是匹配一个a后面跟着1个或多个b的子字符串。倘若我们想要匹配的是1个或多个ab(如:abababab),此时分组就派上作用了,可以这么写:(ab)+。此时ab被绑定为一个整体,后面的数量元字符对这个整体起作用。元字符中有一个或运算符,它与大多数编程语言类似都是用 | 来表示。它的作用为:Ab|aB表示的是匹配Ab或者aB。通过这个例子可以很直观的理解该元字符的作用。当然它也经常和分组一起使用:(Ab|aB)+c,该正则匹配开始为1-N个Ab或aB之后是c的子字符串,如:AbaBc,AbAbAbaBc。后向引用的使用是依附于分组的,分组的概念之前讲过了。首先,我们先看一下正则表达式中组号的分配方式,此时先看一个用到分组的正则表达式:(ab)?(c|C)d。这个正则的意思大家现在肯定都清楚了。这个正则表达式里面用到了两个分组分别是(ab)和(c|C)。正则内部会对所有分组进行组号分配,从左向右,第一个分组(ab)的组号是1,第二个分组(c|C)的组号是2。而组号0代表的是整个正则表达式。尝试过python正则的此处应该有印象,匹配对象的group方法传参为0或不传则返回整个正则所匹配的结果,传参为1为第一个分组匹配的结果。了解了组号分配方式后,可以开始解释后向引用了。后向引用就是将前面某个分组已经匹配的数据拿过来用,第一个分组匹配的数据用\1代替,第二个分组匹配的数据用\2代替,依次类推。似乎不是特别好理解,直接看例子吧,(ab)?(c|C)d\2D该正则中\2表示的是第二个分组匹配到的数据,若第二个分组匹配到了c那么\2就是c,反之亦然。所以它能匹配到:abcdcD,abCdCD。不能匹配:abcdCD,abCdcD。通过这个例子可以理解它的作用了吧。当然分组除了有自己的组号外,还可以给它自定义组名。不同编程语言中的方式不同,Python中自定义组名的格式为:(?Pexp),Name为你自定义的组名,exp代表任意元字符的组合。后面引用的方法为(?P=name)。所以上面例子可以修改成:(ab)?(?Pc|C)d(?P=CWord)D。上一节简单的讲了一下正则表达式是如何分配组号的,但其实还有几个需要注意的地方。

正则表达式怎么用

虽然组号是从左向右进行分配,但是扫描两遍,第一遍先分配给未命名的分组,第二遍再分配给命名的分组。所以命名后的分组组号会更大

使用(?:exp)可以使一个分组不分配组号,如(?:ab)?(c|C)d\2D中(ab)就没有分配到组号,而(c|C)组号为1人性是贪婪的,正则表达式与人一样也是贪婪的。一个正则表达式会尽量多的去匹配字符串,如:ab.+c去匹配’abccccc’是会将该字符串全部匹配出来。但有时候我们只想要其匹配’abcc’,此时怎么办呢?需要给正则表达式中表示数量的元字符加一个?变成ab.+?c。此时该正则表达式就变懒了,不会再去匹配那么多,匹配到‘abcc’就完事了。

正则表达式的Execute方法对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过RegExp 对象的 Pattern 来设置的。Execute方法返回一个Matches集合,其中包含了在 string中找到的每一个匹配的 Match 对象。如果未找到。

这两个个概念有些不太好理解。正如前面所说这两个也是表示位置的元字符。从字面意思上理解,零宽代表其没有宽度,即如之前介绍表示位置的元字符中提到的一样,不会实际占用字符。断言是什么?是assert,是用来判断条件是True还是False。理解完这两个词语的意思后,零宽断言的概念应该也就能理解了。那么负向无非就是它的反义词。

(?<=exp)与上面用法相反,一个正则表达式为(?<=B)A,它代表的情况就是A前面是B的情况。所以匹配出了第一个A。如果改成(?<=C)A,则能匹配出第二个A。

(?!exp)的例子为:A(?!C),它代表的情况为A后面不是C,所以匹配出第二个A。

XXX前/后是XXX的话就写一个=,XXX前/后不是XXX的话就写一个!。这个和日常用的=和!=差不多。

如果表示的意思是前的话,这个元字符就需要出现在前面且要加一个类似于向前指的箭头<。如果表示的意思是后的话,就什么都不需要加。通过上面两个情况的归纳,是不是这四个元字符就都记下来了?到目前为止,正则表达式的基本内容都介绍完了。但是文中用的例子都比较简单,只能帮助你理解概念。如果感兴趣或者工作中能用到的话,还需要后续勤加练习。你以为文章到总结就结束了?So naive,我再来列举一个测试日常工作中的案例,将理论应用到实践(编程语言选择 Python,因为我目前只会这个)。设想这么一个场景,在测试过程中需要获取某个时间段内某个程序的运行情况,从而分析出该程序的稳定性或使用频率等指标,该程序的日志记录完备,日志格式固定且已知。这时候最佳的办法就是从该程序日志中进行相关信息的获取。假如该日志内容格式大概如下(注:该日志样例不是实际项目中的日志文件,为个人举例):从这个日志中可以看到访问成功的IP及其认证账号、访问失败的IP、程序的错误信息。那么我们怎么把这些数据给抓取出来呢?抓取的方法肯定有很多,如果此时你第一时间想到了正则表达式,那么恭喜你,通过阅读前面的文章,正则已经在你心中留下了痕迹,或者它本来就留有痕迹。我们先来分析一下第一条日志,其余的与此类似,有用的信息可以分成如下几个片段:

时间字符串:2020-02-17 11:04:34

日志级别:INFO

IP:182.168.3.111

认证邮箱:110232123@qq.com

状态码:1

客户端获取到的数据大小:12931KB上面几个片段对应的正则为:

QTP使用正则表达式有2种方式,一种是在“常量值选项”对话框或“参数选项”对话框的“值”框中输入字符串的正则表达式语法,可以定义正则表达式。选中“正则表达式”复选框,以指示QuickTest将该值作为正则表达式处理。另一种。

时间字符串:\d{4}-\d{2}-\d{2}\s*\d{2}:\d{2}:\d{2}

日志级别:[INFO]

IP:(\d{1,3}.){3}\d{1,3}

认证邮箱:\w+@\w+.\w+

状态码:\d+

关注我公众号TestingStudio,霍格沃兹的干货都很硬核

上一篇 2023年02月04 04:46
下一篇 2023年01月11 04:02

相关推荐

  • ThomasAlbdorf《I Know I Will See What I Have Seen Before》作品简介与读书感悟

    以下英语美文的精美段落全部摘选自英文网站、权威报纸、名人演讲稿和大学教材,语言地道,适合背诵,如果学会举一反三,就能迅速提高英语作文水平和口头表达能力。第一篇Youth青春YouthYouthisno

    2022年12月16 213
  • 怎么提高打字速度,电脑打字太慢了怎么练

    相信大家都有这样的经历,电脑用久了变得又卡又慢怎么办?下面教你学会这6个操作,瞬间提升电脑速度,一起来看看吧。01.结束程序进程提高速度比较好的办法是将一篇打字稿反复打,比如100个常用单词,第一遍5

    2023年01月19 221
  • pdf怎么拆分,免费pdf拆分成多个pdf

    很多朋友在平时的工作中,经常需要处理一些PDF格式的文件,但是如果PDF文件的占用空间太大,难以进行操作处理,这时我们就需要先将其拆分成多个小文件,那你们知道要怎么把PDF拆分成多个文件吗?今天我就来

    2023年01月16 264
  • 钢铁是怎样炼成的每章主要内容,钢铁怎样炼成1—18章概括

    第一章:失学做工向神甫家发面里撒烟灰激怒神甫,被驱除学校到舍佩托夫卡车站食堂做工,当时12岁。保尔在食堂干了2年,因一次接班人未到,保尔身心疲惫地替人烧开学,累得睡着了,不料水漫金山,遭到普罗霍尔的暴

    2022年12月26 270
  • 怎样把a3纸改成打印a4纸张,a3的卷子a4纸怎样打印

    一、A4文档双面打印成小册子打开文档——打印——属性——版面——小册子(左边装订)基本——打印尺寸(A3)——方向(默认纵向)——其他不用修改确定——打印——OK第一步、首先将红色箭头所指的word文

    2022年12月31 283
  • 怎样才能把作文写好

    经常和文字打交道,看了不少好文章,也看了不少差文章。好的文章,一般都是高站位、有内容,言简意赅、表述准确,读起来如高楼览胜、一目了然。写文章不只是知识分子的工作,各行各业都离不开写文章。在机关事业单位

    2023年01月03 228
  • 欠很多钱怎样走出困境,一个人欠了很多钱怎么才能走出困境

    来自83年的我,从19年疫情影响以来已经负债30w,收入受到行业下滑严重影响,这时我的债务全面爆发,觉得人生没有了任何希望,可以说是想死的心都有过,想了很多法子,晚上兼职代驾、夜班搬运工,找了很多资料

    2023年01月06 236
  • 蒙语怎么说,蒙语自学速成50句

    今天,有张图火了但是原因可能你们都想不到对就是这难度拉满的名字小编见了直挠头薛%……¥*派出所心说查一下吧无奈也只能这样描述“口四方八面读什么”来跟小编读圐(kū)圙(lüè)发音会了你们一定好奇这俩

    2023年02月09 245
  • 怎样自学小提琴,小提琴新手入门

    一、干枯练习法这是在对某一首乐曲做过了多次通盘练习、运用过足够的感情、对音乐处理的布局安排也反复考虑定夺,一切对自己来说有一种饱和感,可能再继续通盘练,再投入感情的练则会失去新鲜感的一种调整性练习。在

    2022年12月29 235
  • 关于诚信的名言名句,10个诚信小故事简短

    1、当信用消失的时候,肉体就没有生命—大仲马2、把“德性”教给你们的孩子:使人幸福的是德性而非金钱。这是我的经验之谈——贝多芬3、惟诚可以破天下之伪,惟实可以破天下之虚。——薛瑄4、诚信是一道山巅的流

    2022年12月12 217
  • 打印小册子怎么设置,word打印成对折小册子怎么排版

    书籍折页打印,在为一些重要场合准备的资料,都需要用到。但我们日常使用的,很多是从word直接实现书籍折页打印。但如果是PDF文档,如何实现书籍折页打印?网上很少有完整介绍,其中有些小诀窍,下面我详细讲

    2023年01月21 287
  • 怎样讽刺自以为是的人,讽刺那些高傲自以为是的人的句子

    人生不如意事十之八九,讽刺那些高傲自以为是的人的句子,遇到困难,有几个人可以从容面对,有谁可以把困难不当一回事?低落、迷茫、伤心在所难免,自以为是的人,你们为何目中无人,站在自己的立场看待一切事物,有

    2022年12月31 281
  • 怎样更换ppt背景图片

    PPT背景图片可以美化ppt,如果所有的ppt背景图片都一致,便可统一ppt风格。ppt背景图片怎么设置全部应用?首先,启动ppt的设置背景格式,在填充位置选择“图片源”插入,然后全部应用即可。ppt

    2022年12月31 260
关注微信