正则表达式

看到朋友写一篇正则表达式非常好,拿来借鉴 一下
正则表达式是一个特殊的字符序列,它描述了一种字符串匹配模式,它能帮助你检查一个字符串是否与指定的规则匹配。要在Python中使用正则表达式必须先引入re包。

import re

简单地说,正则表达式是一个规则,它规定了要从给出的字符串中匹配出符合这个规则的子串。下面以两个例子来说明正则表达式的强大之处。 假设有一个列表如下:

list1 = ['python', 'chinaunicom', 'apple', 'pycharm']

现在需要找出以py开头的元素,通过下面的程序可以做到:

for l in list1:
    if l[0:2] == 'py':
        print(l)

再考虑这样的需求,如果我要找出下面字符串中的数字部分,还能用上面的办法解决吗?

'asf3fsg56fgas793'

你可能会这么干:

list1 = list('asf3fsg56fgas793')
for item in list1:
    if item in list('0123456789'):
        print(item)

但是如果要求不是找出单个数字,而是找出3、56、793呢?这时再用这种思路代码就会变得复杂,通过正则表达式实现就很简单:

import re
a = 'asf3fsg56fgas793'
m = r'\d+'
num = re.findall(m,a)
print(num)    #['3', '56', '793']

上面的\d+就是一个正则表达式,它表示的规则是匹配出现1次或多次的数字(默认是贪婪匹配)。下面简单讲解一下正则表达式的语法。

一个完整的正则表达式一般由原子和元字符组成。
原子

原子是正则表达式的最基本单位,一个正则表达式中至少要包含一个原子。原子是由所有未显示指定为元字符的打印和非打印字符组成的,大致可以分为5类:

普通字符作为原子

普通字符是编写正则表达式时最常见的原子,包括所有的大写和小写字母、所有数字等。

'5'    #用于匹配字符串中是否有5这个字符出现
'python'    #用于匹配字符串中是否有python字符串出现

一些特殊字符和元字符作为原子

任何一个符号都可以作为原子使用,但如果这个符号在正则表达式中有一些特殊的意义,我们就必须使用转义字符""取消它的特殊意义,将其变成一个普通的原子。

'\.'    #用于匹配字符串中的.
'\*\+'    #用于匹配字符串中是否存在*+

一些非打印字符作为原子

所谓的非打印字符,是一些在字符串中的格式控制符号,例如空格、回车及制表符等。

\cx   匹配由x指明的控制字符。例如\cM匹配一个control-M或回车符。x的值必须为A~Z或a~z之一。否则将c视为一个原义的'c'字符。
\f    匹配一个换页符。等价于\x0c和\cL
\n    匹配一个换行符。等价于\x0a和\Cj
\r    匹配一个回车符。等价于\x0d和\cM
\t    匹配一个制表符。等价于\x09和\cI
\v    匹配一个垂直制表符。等价于\x0b和\cK

'\n'      #用于匹配字符串中的换行符
'\r\n'    #用于匹配字符串中的回车符和换行符

使用通用字符类型作为原子

前面都是一个原子只能匹配一个字符。而有时候我们需要一个原子就可以匹配一类字符,例如一个原子匹配所有的数字或字母。这时就需要用到通用字符。

\d    匹配任意一个十进制数字,等价于[0-9]
\D    匹配任意一个除十进制数字以外的字符,等价于[^0-9]
\s    匹配任意一个空白字符,等价于[\f\n\r\t\v]
\S    匹配任意一个空白字符之外的字符,等价于[^\f\n\r\t\v]
\w    匹配任意一个数字、字母、下划线,等价于[0-9A-Za-z_]
\W    匹配任意一个数字、字母、下划线之外的字符,等价于[^0-9A-Za-z_]

'\d'    #'abcd5efg'中匹配5
'\w'    #'1234p567'中匹配p

自定义原子表[]作为原子

通用字符虽然比较强大,但是需求是无止尽的。匹配规则的需求太多了,系统不能全部都提供出来,例如只匹配奇数,或者只匹配元音字母,这时我们就需要系统提供自定义原子的方式。使用原子表[]就可以定义一组彼此地位平等的原子,且从原子表中仅选择一个原子进行匹配。

'[234]G'      #可以匹配2G、3G或者4G
'[a-z]'       #可以匹配所有的小写字母。-号表示连接一组按ASCII吗顺序排列的原子,能够简化书写
'[^234]G'     #可以匹配除了2G、3G、4G之外的所有字符串,例如bG,6G,=G。^号用在原子表中表示匹配除了表内原子外的任意一个字符。

元字符

元字符是用于构建正则表达式的具有特殊含义的字符。在正则表达式中不能单独出现,它必须是用来修饰原子的。如果要匹配元字符本身则要加上""进行转义。

*       匹配0次、1次或多次其前的原子
+       匹配1次或多次其前的原子
?       匹配0次或1次其前的原子
.       匹配除了换行符之外的任意一个字符
|       匹配两个或者多个分支选择
{n}     表示其前面的原子恰好出现n次
{n,}    表示其前面的原子出现不少于n次
{n,m}   表示其前面的原子至少出现n次,最多出现m次
^       匹配输入字符串的开始位置(或在多行模式下行的开头,即紧随一换行符之后)
$       匹配输入字符串的结束位置(或在多行模式下行的结尾,即紧随一换行符之前)
\b      匹配单词的边界
\B      匹配除单词边界以外的部分
[]      匹配方括号中指定的任意一个原子
[^]     匹配除方括号中的原子以外的任意一个字符
()      ()中的字符整体为一个原子,即模式单元。可以理解为由多个单个原子组成的大原子

'a*b'    匹配'ab'、'aaaaaaaab'等在a、b之间存在任意个a的情况
'a.*p'   匹配'ab'、'a67hfyug43b'等在a、b之间存在任意字符且不限个数的情况
'a[oo|qq|vv]b'    匹配'aoob'、'aqqb'、'avvb'其中之一
'a{2,4}b'         匹配'aab'、'aaab'、'aaaab'
'^this'  匹配以this开头的字符串
'this$'  匹配以this结尾的字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值