正则表达式的基本用法,正则表达式用法
其实正则表达式的基本用法的问题并不复杂,但是又很多的朋友都不太了解正则表达式用法,因此呢,今天小编就来为大家分享正则表达式的基本用法的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
正则表达式高级用法
上一章分享了正式表达式的入门知识,以及单字符、多字符常用的匹配方法,对于工作维护过程中已经够用,但是有时候只使用基础知识来实现就会比较麻烦,如果使用高级用法就会比较方便很多。
例如:匹配一个HTML文件中两个<B>标签中的文件。
文本内容:
从上一章内容的知识可以想到的表达式可能如下:
但是这个表达式配置的结果是 AK</B> and<B>HI,而不是我们想要的 AK和 HI。
实现很简单,就是在原有“贪婪型”元字符后面加上一个?号,如下表格
前面的元字符都是对紧挨着前面的一个字符有效,例如表达式 the{3}匹配 theee字符串,假如我们想匹配连续三个 the字符串怎么办呢,这就涉及到子表达式的概念。
把一个表达式匹配的内容做为一个单独的元素嵌入到另外一个表达式中,那这个做为独立元素的表达式就是子表达式,需要使用()括起来。这个跟数学的表达式概念很类似。
并且子表达与数学表达式还有一个类似的地方就是,正则表达式的子表达式也可以嵌套使用
假如我们再加个条件:我们想匹配连续三个 the或者连续三个 you,怎么实现?这就是正则表达式的选择操作符,也叫或操作符了
上面的问题就可以使用正则表达式(the|you){3}来表示
当一个模式的全部或者部分内容由一对括号括起来时,就对表达式进行了分组(其实就是放在()中的子表达式),并且把分组匹配到内容捕获并且临时存放在内存中。这就是捕获分组,可以在后面表达式中使用就叫后向引用,或者叫回溯引用。
默认情况下,分组是从左到右依次排序从1编号,第一个分组就是1,第二个分组就是2等等。
后向引用很简单就是一个 \或者$后面跟相应编号即可。例如 \1或者$1就表示引用第一个捕获分组。
前面讲捕获分组都是通过位置编号来访问,在perl和python、.NET等语言中还支持对捕获分组命名。这样就比较容易理解
顾名思义,与捕获分组相反,就是不会将分组匹配的内容放在内存中。主要是为了提高性能。
使用方法:在分组的开头加上?:,例如(?:the)
环视是一种非捕获分组,它根据某个模式之前或者之后的内容要求匹配其他模式。环视也称为零宽度断言。
(?(id/name)yes-pattern|no-pattern)
如果给定的 id或 name存在,将会尝试匹配 yes-pattern;否则就尝试匹配 no-pattern, no-pattern可选;
例如:email样式匹配(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$),当<存在时,则最后要匹配>;否则匹配结束符$
《学习正则表达式》
《正则表达式必知必会》
Python正则表达式的几种匹配用法
下面列出: 1.测试正则表达式是否匹配字符串的全部或部分regex=ur""#正则表达式
if re.search(regex, subject): do_something()else: do_anotherthing() 2.测试正则表达式是否匹配整个字符串 regex=ur"/Z"#正则表达式末尾以/Z结束
if re.match(regex, subject): do_something()else: do_anotherthing() 3.创建一个匹配对象,然后通过该对象获得匹配细节(Create an object with details about how the regex matches(part of) a string) regex=ur""#正则表达式
match= re.search(regex, subject)if match:# match start: match.start()# match end(exclusive): atch.end()# matched text: match.group() do_something()else: do_anotherthing() 4.获取正则表达式所匹配的子串(Get the part of a string matched by the regex) regex=ur""#正则表达式
match= re.search(regex, subject)if match: result= match.group()else: result="" 5.获取捕获组所匹配的子串(Get the part of a string matched by a capturing group) regex=ur""#正则表达式
match= re.search(regex, subject)if match: result= match.group(1)else: result="" 6.获取有名组所匹配的子串(Get the part of a string matched by a named group) regex=ur""#正则表达式
match= re.search(regex, subject)if match:result= match.group"groupname")else:result="" 7.将字符串中所有匹配的子串放入数组中(Get an array of all regex matches in a string) result= re.findall(regex, subject) 8.遍历所有匹配的子串(Iterate over all matches in a string) for match in re.finditer(r"<(.*?)/s*.*?//1>", subject)# match start: match.start()# match end(exclusive): atch.end()# matched text: match.group() 9.通过正则表达式字符串创建一个正则表达式对象(Create an object to use the same regex for many operations) reobj= re.compile(regex) 10.用法1的正则表达式对象版本(use regex object for if/else branch whether(part of) a string can be matched) reobj= re.compile(regex)if reobj.search(subject): do_something()else: do_anotherthing() 11.用法2的正则表达式对象版本(use regex object for if/else branch whether a string can be matched entirely) reobj= re.compile(r"/Z")#正则表达式末尾以/Z结束
if reobj.match(subject): do_something()else: do_anotherthing() 12.创建一个正则表达式对象,然后通过该对象获得匹配细节(Create an object with details about how the regex object matches(part of) a string) reobj= re.compile(regex) match= reobj.search(subject)if match:# match start: match.start()# match end(exclusive): atch.end()# matched text: match.group() do_something()else: do_anotherthing() 13.用正则表达式对象获取匹配子串(Use regex object to get the part of a string matched by the regex) reobj= re.compile(regex) match= reobj.search(subject)if match: result= match.group()else: result="" 14.用正则表达式对象获取捕获组所匹配的子串(Use regex object to get the part of a string matched by a capturing group) reobj= re.compile(regex) match= reobj.search(subject)if match: result= match.group(1)else: result="" 15.用正则表达式对象获取有名组所匹配的子串(Use regex object to get the part of a string matched by a named group) reobj= re.compile(regex) match= reobj.search(subject)if match: result= match.group("groupname")else: result="" 16.用正则表达式对象获取所有匹配子串并放入数组(Use regex object to get an array of all regex matches in a string) reobj= re.compile(regex) result= reobj.findall(subject) 17.通过正则表达式对象遍历所有匹配子串(Use regex object to iterate over all matches in a string) reobj= re.compile(regex)for match in reobj.finditer(subject):# match start: match.start()# match end(exclusive): match.end()# matched text: match.group()字符串替换 1.替换所有匹配的子串#用newstring替换subject中所有与正则表达式regex匹配的子串
result= re.sub(regex, newstring, subject) 2.替换所有匹配的子串(使用正则表达式对象) reobj= re.compile(regex) result= reobj.sub(newstring, subject)字符串拆分 1.字符串拆分 result= re.split(regex, subject) 2.字符串拆分(使用正则表示式对象) reobj= re.compile(regex) result= reobj.split(subject)
如何记住正则表达式
正则表达式很熟悉,又很陌生。熟悉的是正则表达式的用途实在是太多了,陌生的可能是怎么记也记不住,只有在用的时候才会去查询它的用法,下面还是全方位了解下正则表达式。
上面是百科上的概念,简单概括正则其实就是“一种描述文本内容组成规律的表示方式”。
正则表达式的用途基本就是如下几种:
最常见的就是对手机号、身份证、邮箱等信息做校验,此外校验数字、汉字等等。
在各种编辑器里都有查找的功能,其中有一项就是用正则匹配查找内容,这是一种用途。
切割容易想到的就是Java里String的split方法,按照某种表达式切割。
非常常见的正则表达式,看看都是有什么字符来表示。
1.数字:^[0-9]*$
2.n位的数字:^\d{n}$
3.至少n位的数字:^\d{n,}$
4.由26个英文字母组成的字符串:^[A-Za-z]+$
5.中文字符的正则表达式:[\u4e00-\u9fa5]
6.由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
7.Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
8.身份证号(15位、18位数字):^\d{15}|\d{18}$
元字符是构成正则表达式的基本元件,所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符。
记住正则表达式还是有技巧的,就是记住元字符。
下面推荐一个正则表达式网站 ,帮助我们学习和验证正则表达式。
参考文献:
文章到此结束,如果本次分享的正则表达式的基本用法和正则表达式用法的问题解决了您的问题,那么我们由衷的感到高兴!