本文主要介绍python中正则表达式的基本用法,做一个初步的认识。

1. 初识

python通过re内置模块来处理正则表达式(regex),底层使用C引擎。一个简单的正则匹配的例子:

import re
# 正则
p = re.compile(r'[a-zA-Z0-9]')
s = 'hello 123, world!'
print re.findall(p,s) # 输出:
# ['h', 'e', 'l', 'l', 'o', '1', '2', '3', 'w', 'o', 'r', 'l', 'd']

元字符:所谓元字符,指的是那些不仅仅可以表示字符本身含义、并且还可以表示其他特殊含义的字符。正则中的元字符主要有如下这些:

. ^ $ * + ? { } [ ] \ | ( )

要在正则中匹配元字符本身,需要使用转义符号,比如如果要匹配"+"符号,则在正则中要写成:"\+".

2. 正则元字符含义解释

1. [ ]

(1) 常用来指定一个字符集,如[abc]匹配:a或b或c

(2) 元字符在"[]"中不起所用,比如:[a+]匹配:a或+

但注意:在方括号中要匹配转义符“\”本身,要用:"\\";要匹配方括号开头的"^"符本身,要用:"^";要匹配"-"字符,需要用:"\-"

(3) 补集匹配:[^a],匹配非a的一个字符

(4) 匹配连续字符:[a-zA-Z0-9],匹配大小写英文字母和数字

2. ^

匹配行首,在MULTILINE模式中,直接匹配字符串中的每一个换行。

3. $

匹配行尾,行尾是指:字符串尾,或一个换行字符后的任何位置。

4. \

转义字符,如果要匹配""本身,需要使用再次转义:"\\"。

一些特殊字符:

\d:匹配:[0-9]

\D:匹配:[^0-9]

\s:匹配:任何空白符,即:[\t\n\r\f\v]

\S:匹配:任何非空白符,即:[^\t\n\r\f\v]

\w:匹配:[a-zA-Z0-9_ ]

\W:匹配:[^a-zA-Z0-9_ ]

5. *

匹配前一个字符或子表达式出现0次或多次。

6. +

匹配前一个字符或子表达式出现1次或多次。

7. ?

(1) 匹配前一个字符或子表达式出现1次或0次。

(2) 表示非贪婪匹配:

import re
# 贪婪模式,会尽量多地去匹配
r1 = re.compile(r'ab+')
s1 = 'abbb'
print re.findall(r1,s1) # 非贪婪模式,会尽量少地去匹配
r2 = re.compile(r'ab+?')
s2 = 'abbb'
print re.findall(r2,s2) # 输出:
'''
['abbb']
['ab']
'''

8. {}

匹配前一个字符或子表达式出现指定次数:

  • {0,}:0次或多次,相当于"*"

  • {1,}:1次或多次,相当于"+"

  • {0,1}:0次或1次,相当于"?"

  • {m,n}:m次到n次(m <= n)

随机推荐

  1. ltp的使用

    ltp 可以分词 词性识别 命名实体识别,使用过程: import pyltp from pyltp import SentenceSplitter from pyltp import Segment ...

  2. NGINX date_udf 定义日志

    Nginx日志自动按日期存储 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器,因它的稳定性 ...

  3. response.sendRedirect 的功能是地址重定向(页面跳转)

    response.sendRedirect 的功能是地址重定向(页面跳转) 1.response.sendredirect(url); 新的页面并不能处理旧页面的pagecontext(request ...

  4. Hook length formula 学习笔记 UVALive 6625

    最近做到一个关于杨氏矩阵的题目. UVALive 6625 题目大意是用n以内的数填充杨氏矩阵,要求行严格递增,列不严格递增. 求方案数. 数据范围很小,我直接上爆搜,结果TLE了. 后来发现一位学长 ...

  5. Linux命令之umask

    一 权限掩码umask umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常用到的是后3个,例如你用chmod 755 file(此时这文件的权限是属主读( ...

  6. ini文件

    *.INI内容 [NETWORK] ServerIP=100.100.100.53 程序: main() { char ip[16]; DWORD num=0; num=GetPrivateProfi ...

  7. VC++ 得到的函数地址与实际函数地址不一致的原因。

    我想试验一个计算汇编指令长度的代码是否正确,因而写了如下code进行验证,但结果非常奇怪 #include <stdio.h> #include <Windows.h> int ...

  8. 【BZOJ1925】[Sdoi2010]地精部落 组合数+DP

    [BZOJ1925][Sdoi2010]地精部落 Description 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从 ...

  9. JAVA的Hashtable在遍历时的迭代器线程问题

    这篇博客主要讲什么 Hashtable及其内部类的部分源码分析 Hashtable在遍历时的java.util.ConcurrentModificationException异常的来由和解决 单机在内 ...

  10. Spring 事务机制详解(事务的隔离性和传播性)

    原文出处: 陶邦仁 Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考. Spring声明式事务让我们从复杂的事务处理中得到 ...