python中正则表达式讲解_python正则表达式 详解 (一)

Python 正则表达式 “详解” 上

大家好,今天我们来学习以下Python的正则表达式 ,大家可能比较陌生,不过我却要告诉你,你每天都在使用正则表达式,不要不承认,就问最常见的,浏览器每天在用不,淘宝是不是在经常逛,你在搜索框里输入几个字按下回车,就出来了大量的结果,你想想是怎么办到的,是正则表达式,可以毫不夸张的讲,没有正则表达式,就没有搜索引擎,估计有些人听不懂,没问题接下来我们来看两张图 如下 :

大家看在进行百度搜索的时候,为什么你搜索什么内容,就会给你得到想要的内容,是因为网址帮你生成了正则表达式 , 当然搜索引擎绝不止正则表达式这么简单,但正则表达式无疑占据了核心的位置 .

说了这么多那什么是正则表达式呢? 正则表达式又称之为规则表达式(英语:Regular Expression 在代码中简写为regex,regexp,re)是计算机科学的概念, 正则表达式通常用来检索,替换那些符合某个格式模式的文本(规则)。

通常总结两种:

1 字符串是否符合正则表达式的过滤逻辑:

2 可以通过正则表达式,字符串中,获取我们想要的特定的部分:

在python中使用正则表达式 首选需要导入 re模块:

先给出一个列子 怎么样在列表中才能找到 以py 开头的字符串呢:

大家可能会想到用for 循环来解决: 如下:

#!/user/bin/env python

import re

url=['hello','pyton','pyinfo','pygame','china','apple']

s=[]

for i in url:

if i[0:2] == 'py':

s.append(i)

print(s)

结果如下:

D:\Download>python test.py

['pyton', 'pyinfo', 'pygame']

其实以这种情况似乎用不了正则表达式,那么我现在给出下面的字符串,要求要把字符串中所有的数字都给提取出来,比如字符串'ab23fd5g67',需要提取的数字是 23 5 67 ,注意不能把数字分开,该怎么办,这个时候用上面的方法可能就比较困难, 下面就该正则表达式出场了。

#!/user/bin/env python

import re

a='ab23fd5g67'

m = r'[0-9]+'

num = re.findall(m,a)

print(num)

D:\Download>python test.py

['23', '5', '67']

match语法:

match(parttern,string,flages=0)

ok ,首先介绍第一个正则表达式匹配方法,叫做match方法,match方法用于尝试从字符串起始位置匹配一个正则表达式 ,匹配成功则返回一个match对象,如果没有匹配成功,则返回一个None, parrtern 指的是匹配一个正则表达式,String指的是用于匹配的字符串,flag是标志位,用于控制正则表达式的匹配方式 ,如:是否区分大小写 ,多行匹配等。

接下来的列子,就以match方法为测试对象教大家书写一个正则表达式,首先给出一个简单的字符串'hello World' 。

#!/user/bin/env python

import re

str1='hello world'

m = 'hello world'

ms = re.match(m,str1)

print(ms)

print(ms.group())

print(ms.span())

D:\Download>python test.py

hello world

(0, 11)

解释以下Match 对象的group(0)用于返回匹配的整个字符串,span()方法,用以元组的方式返回匹配的起始位置和结束位置

大家看到可以成功匹配了,这个时候有人会问,不是要写正则表达式吗你写个'hello world'干嘛,其实'hello wolrd'也是一个正则表达式,只不过它只能匹配字符串'hello world'或以'hello wolrd'开头的i字符串而已, 下面这个列子 大家看下如何匹配字符串:

str1='Tom'

str2='Toim'

str3='Tooooooom'

这个时候 上面的列子就没有用了,我们总不能写三个一模一样的字符串来进行匹配把,大家看到三个字符串的开头以及结尾都一样,就中间字符串不一样,那我们可以这样写:

str1='Tom'

str2='Toim'

str3='Tooooooom'

m = r'T[io]+m'

ms = re.match(m,str1)

ms2 = re.match(m,str2)

ms3 = re.match(m,str3)

print(ms)

print(ms.group())

print(ms.span())

print(ms2)

print(ms2.group())

print(ms2.span())

print(ms3)

print(ms3.group())

print(ms3.span())

D:\Download>python test.py

Tom

(0, 3)

Toim

(0, 4)

Tooooooom

大家可以看到m成功的匹配出上面三个字符串,为什么可以做到呢,我们来分析以下,正则表达式为r'T[io]+m'最前面的t和最后面的m就不讲了,大家一看便知道,我们重点讲一下中间的[io+],[io] 表示匹配的字符串可以是中括号的任意一个i或o,而后面跟着的 +号表示可以对[io]匹配一次或多次,所以只要满足这一条件的字符串都是可以被匹配的。

ok接下来,我想写一个正则表达式,用来匹配仅以数字组成的i字符串,大家看怎么实现。

#!/user/bin/env python

import re

str1='54678'

str2='54678ghj'

m = r'^[0123456789]+$'

ms = re.match(m,str1)

ms2 = re.match(m,str2)

print(ms)

print(ms.group())

print(ms2.group())

下面解释以下:

符号^匹配行首,符号$匹配首尾,中括号里面的内容表示字符串中所能包括的字符,不过这样写是不是有点笨,我的要求是写一个能匹配所有仅 以字母组成的字符串的正则表达式,你还不得把26个字母写全了, 加上大小写一共52个, 多费劲。大家别担心,你能想到的,语言早就能想得到,python还支持这样写

str1='54678'

str2='asdasdzxczxcxzcAASDZXCZXC'

m = r'^[0-9]+$'

m2=r'$[a-zA-Z]+$'

ms=re.match(m,str1)

ms2=re.match(m2,str2)

很方便把,其实还有更简单的即使使用正则表达式中的特殊字符^,$,-都是特殊字符,不过特殊字符绝对不指这么一点,接下来我们来学习python的正则表达式。

'.' 用于匹配除换行符(\n)之外的所有字符。

'^'尖括号,用于匹配字符串的开始,即行首。

'$'doller符号,用于匹配i字符串的末尾(‘末尾如果有换行符\n,就匹配\n前面的字符串’)即行尾。

''用于将前面的模式匹配0次或多次(贪婪模式,即极可能的多的匹配)

‘+’用于将前面的模式匹配1次或多次 (贪婪模式)

'?' 用于将前面的模式匹配0次或多次(贪婪模式)

‘?,+?,??’即上面三种特殊字符的非贪婪模式(尽可能少的匹配)。

‘{m,n}’用于将前面的模式匹配m次到n次(贪婪模式),即最小匹配m次,最大匹配n次。

‘{m,n}?’即上面‘{m,n}’的非贪婪版本。

‘\’:'\'是转义字符,在特殊字符前面加上\,特殊字符就失去了其所代表的含义,比如+就仅仅代表加号+本身。

‘[]’用于标示一组字符,如果^是第一个字符,则标示的是一个补集。比如[0-9]表示所有的数字,[^0-9]表示除了数字外的字符。

‘|’比如A|B用于匹配A或B。

‘(...)’用于匹配括号中的模式,可以在字符串中检索或匹配我们所需要的内容。

再补充一下,字符串的前面加上字母r就表示raw string,也叫做原始字符串,为什么要有原始字符串呢?举个列子, 我的D盘下有个newProject的文件夹,而我在某个程序中正好需要这个文件夹的路径我们再python中写下大家看下效果。

path=r'D:\NewProject'

print(path)

D:\Download>python tes11..py

D:\NewProject

python 把 \n当成了换行符,当然也可以i使用转义字符,在\n 换行符前面加上一个\ 符号,\n 就不代表换行符了,仅仅代表一个符号 \。

Python中的转义字符 :

\A 代表从字符串的开始处匹配。

\Z 表示从字符串的结束处匹配,如果存在换行,只匹配到换行前面的字符串。

\b匹配一个单词的边界,也就是指单词和空格间的位置,列如:

'py\b' 也可以匹配'python'中的'py' 但不能匹配'openpythonpx' 的'py'

\B 匹配非单词边界, py\B 可以匹配"openpythonpx" 的"py" 但不能匹配 "python中的 “py"

\d 匹配与任意的数字 等价于[0-9].

\D匹配任意非数字字符,等价于[^0-9]

\s匹配任意空白字符,等价于[\t\n\r\f]

\S匹配任意非空白字符,等价于[^\s]

\w匹配任意字母数字下划线,等价于[a-zA-Z0-9]

\W匹配任意非字母数字下环线,等价于[^\w]

\匹配原义的反斜杠\

ok , 今天就讲这么多了,我们再下次的讲解中, 我们结合re模块的方法在进行阐述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值