正则表达式进阶——你从没想过的正则表达式使用方式
Posted jacen789
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式进阶——你从没想过的正则表达式使用方式相关的知识,希望对你有一定的参考价值。
对正则表达式感兴趣的可以玩一下RegexGolf:https://alf.nu/RegexGolf
从中可以学到三个新的技能:
1、正则表达式不匹配
如果你想匹配含有镜像子串的字符串,如abba、anallagmatic、bassarisk等等。
你可以写出正则表达式:
(.)(.)\2\1
但是要是你不想匹配这些字符串的话,可以这么写正则表达式:
^(?!.*(.)(.)\2\1)
利用"^"和"(?!...)",即匹配字符串的开头,然后前视取反来完成。
2、正则匹配合数长度的字符串
正则表达式如下:
^(xx+)\1+$
3、正则匹配任意数的任意次幂长度的字符串
匹配2的任意次幂长度的字符串的正则表达式如下:
^(?:(x+)(?=\1$))*x$
再者,匹配5的任意次幂长度的字符串的正则表达式如下:
^(?:(x+)\13(?=\1$))*x$
下面用程序验证一下:
# -*- coding: utf-8 -*- import re for i in range(1000): s = ‘x‘ * i if re.match(r‘^(?:(x+)(?=\1$))*x$‘, s): # 匹配由x组成的长度为2的任意次幂的字符串 print(len(s)) print(‘-‘ * 79) for i in range(1000): s = ‘x‘ * i if re.match(r‘^(?:(x+)\13(?=\1$))*x$‘, s): # 匹配由x组成的长度为5的任意次幂的字符串 print(len(s))
输出结果是:
1
2
4
8
16
32
64
128
256
512
-------------------------------------------------------------------------------
1
5
25
125
625
以上是关于正则表达式进阶——你从没想过的正则表达式使用方式的主要内容,如果未能解决你的问题,请参考以下文章