频道栏目
首页 > 网络 > 其他 > 正文

python正则表达式 详解 (一)-wx5cd4e68d52471的博客-51CTO博客

2019-05-15 18:42:33           
收藏   我要投稿

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
<re.Match object; span=(0, 11), match='hello world'>
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
<re.Match object; span=(0, 3), match='Tom'>
Tom
(0, 3)
<re.Match object; span=(0, 4), match='Toim'>
Toim
(0, 4)
<re.Match object; span=(0, 9), match='Tooooooom'>
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模块的方法在进行阐述。

上一篇:0514课的预习任务-张森纳-51CTO博客
下一篇:通过命令行将本地的静态文件同步至阿里云OSS-枫林晚-51CTO博客
相关文章
图文推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站