正则表达式进阶——你从没想过的正则表达式使用方式

对正则表达式感兴趣的可以玩一下RegexGolf:https://alf.nu/RegexGolf

从中可以学到三个新的技能:

1、正则表达式不匹配

如果你想匹配含有镜像子串的字符串,如abba、anallagmatic、bassarisk等等。

你可以写出正则表达式:

(.)(.)\2\1

但是要是你不想匹配这些字符串的话,可以这么写正则表达式:

^(?!.*(.)(.)\2\1)

利用"^"和"(?!...)",即匹配字符串的开头,然后前视取反来完成。

2、正则匹配合数长度的字符串

正则表达式如下:

^(xx+)\1+$

3、正则匹配任意数的任意次幂长度的字符串

匹配2的任意次幂长度的字符串的正则表达式如下:

^(?:(x+)(?=\1$))*x$

再者,匹配5的任意次幂长度的字符串的正则表达式如下:

^(?:(x+)\1{3}(?=\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+)\1{3}(?=\1$))*x$‘, s):  # 匹配由x组成的长度为5的任意次幂的字符串
        print(len(s))

输出结果是:

1
2
4
8
16
32
64
128
256
512
-------------------------------------------------------------------------------
1
5
25
125
625

原文地址:https://www.cnblogs.com/jacen789/p/11296241.html

时间: 2024-10-28 15:54:46

正则表达式进阶——你从没想过的正则表达式使用方式的相关文章

Python正则表达式------进阶

Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象.该对象拥有一系列方法用于正则表达式匹配和替换. re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数. 本章节主要介绍Pyt

2、正则表达式进阶_之一

#!/usr/bin/perl foreach $var(glob("*.wav")) { #$var =~ /.*(00.*).wav/; $var =~ /.*(00\d\d).wav/; $Newvar = 'SpkContext_zj_'.$1.'.wav'; system("mv $var $Newvar"); print "Now is processing $var \t \n"; } print "Over \n&quo

1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用

简介: 本文是系列博客的第一篇,主要讲解和分析正则表达式规则以及JAVA中原生正则表达式引擎的使用.在后续的文章中会涉及基于NFA的正则表达式引擎内部的工作原理,并在此基础上用1000行左右的JAVA代码,实现一个支持常用功能的正则表达式引擎.它支持贪婪匹配和懒惰匹配:支持零宽度字符(如"\b", "\B"):支持常用字符集(如"\d", "\s"等):支持自定义字符集("[a-f]","[^b-

正则表达式匹配解析过程探讨分析(正则表达式匹配原理)

已经有多篇关于正则表达式介绍的文章,随着我们越来越多使用正则表达式,想对性能做优化.减少我们正则表达式书写匹配Bug.我们不得不进一步深入了解正则表达式执行过程了.下面我们一起学习,分析下正则表达式执行过程.我们会用regexbuddy测试工具分解执行过程,具体工具使用,可以看:正则表达式性能测试工具推荐.优化工具推荐(regexbuddy推荐).要了解正则表达式解析过程前,我们先来熟悉几个概念. 常见正则表达式引擎 引擎决定了正则表达式匹配方法及内部搜索过程,了解它至关重要的.目前主要流行引擎

廖雪峰Java9正则表达式-2正则表达式进阶-3分组匹配

匹配电话号码 匹配成功后,如果提取想要的字符串 使用(...)可以分组:"^(\d{3,4})\-(\d{6,8})$" String.matcher vs Pattern.matcher public static void main(String[] args){ String regex = "^\\d{3,4}\\-\\d{6,8}"; System.out.println("010-123456789".matches(regex));

java正则表达式匹配文本中想要的字符串

需求:获取一个本地文件中所有符合 $[MAKE_PACKAGE] 格式的字符串,并输出到另一个文件中. public static void main(String[] args) throws Exception { loadVar("src/cn/don9/templates/Action.txt","src/cn/don9/templateVar/SysActionVar.txt"); } public static void loadVar(String i

正则表达式进阶

捕获组 捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或手动命名的组里,以供后面引用. 表达式 说明 (Expression) 普通捕获组,将子表达式Expression匹配的内容保存到以数字编号的组里 (?<name> Expression) 命名捕获组,将子表达式Expression匹配的内容保存到以name命名的组里 普通捕获组(在不产生歧义的情况下,简称捕获组)是以数字进行编号的,编号规则是以“(”从左到右出现的顺序,从1开始进行编号.通常情况下,编号为0的组表示整

bash 正则表达式进阶--egrep

bash的正则表达式有些特殊的用法,需要使用egrep来替代grep语句: 1. "+" 重复前一个字符re至少一次(这里要区别".",也即重复0或者更多次) 2. "?" 重复前一个字符0或者1次 3. "|" 或者的意思,匹配前或者匹配后都算匹配成功 4. "()" 群组匹配,我的理解(就是把括号内的内容当作一个整体去匹配) 5. "()+" 重复括号内的内容至少一次 原文地址:ht

正则表达式学习笔记——常用的20个正则表达式校验

1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间. /^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/ 2. 校验中文 字符串仅能是中文. /^[\\u4e00-\\u9fa5]{0,}$/ 3. 由数字.26个英文字母或下划线组成的字符串 /^\\w+$/ 4. 校验E-Mail 地址 同密码一样,下面是E-mail地址合规性的正则检查语句. /[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.