1.正则表达式基本概念

背景

我们要匹配以xxx开头的字符串、xxx结尾的字符串等时,每一次匹配都要单独写一个函数或语句来完成,正则表达式就是将匹配的方法抽象成一个规则,然后使用这个规则来进行文本或数据的匹配。

概念

是使用单个字符串来描述匹配一系列符合某个语法规则的字符串

是对字符串操作的一种逻辑公式

应用场景

处理文本或数据

处理过程

依次拿出表达式和目标数据进行字符比较,如果每一个字符都能匹配,则匹配成功,否则,失败。

2.Python正则表达式之re模块

字符串自带的查找方法

str1.find(str2)

str1.startswith(str2)

str2.endswith(str2)

re模块使用

导入re模块

import re

生成pattern实例

pa=re.pattern(正则表达式, flag)

参数

正则表达式

最好是raw字符串;

如果正则表达式首位带括号,则最终的match实例.groups()方法可以以元组的形式展示匹配到的字符串,如r'(study)',但是元组中始终只有一个元素。

flag

re.A | re.ASCII

对\w、\W、\b、\B、\d、\D、\s和\S产生影响,编译后的模式对象在进行匹配的时候,只会匹配ASCII字符,而不是Unicode字符。

re.I | re.IGNORECASE

在匹配的时候忽略大小写

re.M | re.MULTILINE

默认,元字符^会匹配字符串的开始处,元字符$会匹配字符串的结束位置和字符串后面紧跟的换行符之前(如果存在这个换行符)。

如果指定了这个选项,则^将会匹配字符串的开头和每一行的开始处,紧跟在每一个换行符后面的位置。

类似的,$会匹配字符串的最后和每一行的最后,在接下来的换行符的前面的位置。

>>> p = re.compile(r'(^hello$)\s(^hello$)\s(^hello$)\s')>>> m = p.search('hello\nhello\nhello\n')>>> print(m)

None>>> p = re.compile(r'(^hello$)\s(^hello$)\s(^hello$)\s', re.M)>>> m = p.search('\nhello\nhello\nhello\n')>>>m.groups()

('hello', 'hello', 'hello')

re.S | re.DOTALL

使得.元字符可以匹配任何字符,包括换行符。

re.X | re.VERBOSE

这个选项允许编写可读性更强的正则表达式代码,并进行自由的格式化操作。

当这个选项被指定以后,在正则表达式之间的空格符会被忽略,除非这个空格符是在一个字符类中[ ],或者在空格前使用一个反斜杠\。

这个选项允许对正则表达式进行缩进,使得正则表达式的代码更加格式化,更加清晰。并且可以在正则表达式的代码中使用注释,这些注释会被正则表达式引擎在处理的时候忽略。

注释以'#'字符开头。所以如果需要在正则表达式中使用'#'符号,需要在前面添加反斜杠'\#'或者将它放在[]中,[#]。

charref = re.compile(r"""&[#] # Start of a numeric entity reference

(

0[0-7]+ # Octal form

| [0-9]+ # Decimal form

| x[0-9a-fA-F]+ # Hexadecimal form

)

; # Trailing semicolon""", re.VERBOSE)

如果没有指定re.**VERBOSE**选项,则相当于:

charref= re.compile("(0[0-7]+"

"|[0-9]+"

"|x[0-9a-fA-F]+);")

使用pattern实例来进行匹配

match()    从字符串指定位置开始匹配,匹配到就停止,返回match对象

match(string[, pos[, endpos]]) --> match object or None.

Matches zero or more characters at the beginning of the string

search()   从字符串指定位置之后的任意位置开始匹配,匹配到就停止,返回Match对象

search(string[, pos[, endpos]]) --> match object or None.

Scan through string looking for a match, and return a corresponding match object instance. Return None if no position in the string matches.

findall()    从字符串指定位置之后的任意位置开始匹配,匹配到了继续匹配,返回字符串中所有匹配的字符串组成的列表。

注意:如果正则表达式中有()分组,则findall返回的是被()括起来的分组字符串所组成的列表。

findall(string[, pos[, endpos]]) --> list.

Return a list of all non-overlapping matches of pattern in string.

finditer()  从字符串指定位置之后的任意位置开始匹配,匹配到了继续匹配,返回一个包含了所有的Match对象的迭代器

finditer(string[, pos[, endpos]]) --> iterator.

Return an iterator over all non-overlapping matches for the RE pattern in string. For each match, the iterator returns a match object.

sub()         将字符串通过正则表达式匹配到的字符使用repl进行制定次数的替换(默认全部替换),repl可以是字符串,也可以使方法名。

当为方法名时,repl方法接收匹配到的match对象,且该sub()方法返回repl方法的返回值

sub(repl, string[, count = 0]) --> newstring

Return the string obtained by replacing the leftmost non-overlapping occurrences of pattern in string by the replacement repl.

split()        将字符串通过正则表达式匹配到的字符进行指定次数的分割(默认全部),返回分割后的列表

split(string[, maxsplit = 0])  --> list.

Split string by the occurrences of pattern.

# 导入re模块

>>> importre

# 生成pattern对象>>> pa=re.compile(r'(ddd)')

# 使用pattern对象通过match方法进行匹配,得到match对象>>> ma=pa.match('dddsssdddsssddd\ndddsssdddsssddd',5)>>>ma.groups()

Traceback (most recent call last):

File"", line 1, in AttributeError:'NoneType' object has no attribute 'groups'

# 使用pattern对象通过search方法进行匹配,得到match对象

>>> ma=pa.search('dddsssdddsssddd\ndddsssdddsssddd',5)>>>ma.groups()

('ddd',)

# 使用pattern对象通过findall方法进行匹配,得到匹配到的字符串所组成的列表

>>> ma=pa.findall('dddsssdddsssddd\ndddsssdddsssddd',5)>>>ma ['ddd', 'ddd', 'ddd', 'ddd', 'ddd']

# 使用pattern对象通过finditer方法进行匹配,得到匹配到的Match对象所组成的迭代器

>>> for i in pa.finditer('dddsssdddsssddd\ndddsssdddsssddd',5):

...printi

...<_sre.sre_match object at>

# 使用pattern对象通过sub方法进行替换,得到替换后的新字符串

>>> ma=pa.sub('aaa','dddsssdddsssddddddsssdddsssddd')>>> printtype(ma),maaaasssaaasssaaaaaasssaaasssaaa>>> ma=pa.sub('aaa','dddsssdddsssddddddsssdddsssddd',2)>>> printtype(ma),maaaasssaaasssddddddsssdddsssddd>>> defupper_str(match):

...returnmatch.group().upper()

...>>> ma=pa.sub(upper_str,'dddsssdddsssddddddsssdddsssddd',2)>>> printtype(ma),maDDDsssDDDsssddddddsssdddsssddd

# 使用pattern对象通过sub方法进行分割,得到分割后的字符串组成的列表

>>> ma=pa.split('dddsssdddsssddddddsssdddsssddd',2)>>> printtype(ma),ma ['', 'sss', 'sssddddddsssdddsssddd']>>> ma=pa.split('dddsssdddsssddddddsssdddsssddd')>>> printtype(ma),ma ['', 'sss', 'sss', '', 'sss', 'sss', '']

匹配对象属性

group()    返回正则表达式匹配到的字符串

groups()  返回正则表达式匹配到的字符串构成的元组。注意:如果正则表达式中有()分组,则groups()中是被()括起来的分组字符串所组成的列表。

>>> ma = re.match(r'[\w]{6,11}@(163|qq|huawei)(163|qq|huawei)\.com\1\2','yc123456@163qq.com163qq')>>>ma.group()'yc123456@163qq.com163qq'

>>>ma.groups()

('163', 'qq')

start()       返回匹配的起始位置

end()        返回匹配的结束位置

span()      返回一个包含匹配的起始位置和结束位置的元组(start, end)

string       进行匹配的源字符串

ma.re       进行匹配的正则表达式

3.正则表达式基本语法

匹配单个字符

.    匹配任意字符,除了\n

[...]    匹配字符集。如[a-z]

\d|\D    匹配数字|非数字

\s|\S    匹配空白|非空白

\w|\W    匹配word字符|非word字符。[a-zA-Z0-9]

\[\]    匹配字符串中的[]

匹配多个字符

*    匹配前一个字符0次或无限次

+    匹配前一个字符1次或无限次。如匹配有效标识符r'[_a-zA-Z]+\w'

?    匹配前一个字符0次或1次。如匹配两位数r'[1-9]?[0-9]'。注:09的匹配结果是0

{m}|{m,n}    匹配前一个字符m次或者m到n次。如匹配qq邮箱r'\w{6,10}@qq.com'

*? |+? |??    *、+、?的匹配模式变为非贪婪模式。即返回的匹配结果会是最少的。

>>> re.findall(r'[0-9]k*','1kkkk')

['1kkkk']>>> re.findall(r'[0-9]k*?','1kkkk')

['1']>>> re.findall(r'[0-9]k?','1kkkk')

['1k']>>> re.findall(r'[0-9]k??','1kkkk')

['1']>>> re.findall(r'[0-9]k+','1kkkk')

['1kkkk']>>> re.findall(r'[0-9]k+?','1kkkk')

['1k']

边界匹配

^    匹配字符串开头

$    匹配字符串结尾

\A|\Z    指定的字符串必须为开头|结尾

>>> re.findall(r'\A[0-9].*k\Z','1kkkk')

['1kkkk']>>> re.findall(r'\A[0-9].*k\Z','1kkkz')

[]

分组匹配

|    匹配左右任意一个表达式。如匹配0~100:r'^[0-9]$|^[1-9][0-9]$|^100$'

>>> re.findall(r'^[0-9]$|^[1-9][0-9]$|^100$','100')

['100']>>> re.findall(r'^[0-9]$|^[1-9][0-9]$|^100$','9')

['9']>>> re.findall(r'^[0-9]$|^[1-9][0-9]$|^100$','99')

['99']>>> re.findall(r'^[0-9]$|^[1-9][0-9]$|^100$','09')

[]    单字符集。

(ab)    括号中的表达式作为一个分组。

从左到右按顺序为1,2,3。常用于不同的个别单词。如匹配163邮箱和qq邮箱:r'\w{6,11}@(163|qq|huawei).com'

>>> re.match(r'[\w]{6,11}@(163|qq|huawei)\.com','yc123456@163.com').group()'yc123456@163.com'

>>> re.match(r'[\w]{6,11}@(163|qq|huawei)\.com','yc123456@qq.com').group()'yc123456@qq.com'

>>> re.match(r'[\w]{6,11}@(163|qq|huawei)\.com','yc123456@huawei.com').group()'yc123456@huawei.com'

\    引用编号为num的分组匹配到的字符串。类似于管道命令中的xargs -i。

注:\1对应第一个()所匹配到的字符串。如果只有1个分组(),但是使用\2,则会报错。如用来匹配XML文件

>>> re.match(r').*\1','test').group()'test'

>>> re.match(r').*\1','test').group()

Traceback (most recent call last):

File"", line 1, in AttributeError:'NoneType' object has no attribute 'group'

>>> re.match(r').*\1','test').group()

Traceback (most recent call last):

File"", line 1, in AttributeError:'NoneType' object has no attribute 'group'

(?P)    给分组起别名

(?P=name)    引用起过别名的分组

>>> re.match(r'[\w]{6,11}@(?P163|qq|huawei)(?P163|qq|huawei)\.com(?P=type1)(?P=type2)','yc123456@163qq.com163qq').group()'yc123456@163qq.com163qq'

>>> re.match(r'[\w]{6,11}@(?P163|qq|huawei)(?P163|qq|huawei)\.com(?P=type1)(?P=type2)','yc123456@163qq.com163163').group()

Traceback (most recent call last):

File"", line 1, in AttributeError:'NoneType' object has no attribute 'group'

python startswith正则表达式_Python 正则表达式相关推荐

  1. python正则表达式_Python正则表达式简记和re库!

    正则表达式是定义搜索模式的字符序列.通常这种模式被字符串搜索算法用于字符串上的"查找"或"查找和替换"操作,或者用于输入验证. 1. 正则表达式的语法 . 表示 ...

  2. python compile正则_Python 正则表达式:compile,match

    本文以匹配×××ID为例,介绍re模块的compile与match的用法 复杂匹配 = re.compile(正则表达式): 将正则表达式实例化 + re.match(要匹配的字符串): 从字符串开 ...

  3. 菜鸟教程python正则表达式_Python正则表达式常用函数菜鸟教程

    这篇文章主要为大家详细介绍了Python正则表达式常用函数菜鸟教程,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! Py ...

  4. python正则匹配_Python正则表达式只匹配一次

    我正在尝试创建一个简单的降价乳胶转换器,只是为了学习 python和基本的正则表达式,但我不知道试图弄清楚为什么下面的代码不起作用: re.sub (r'\[\*\](.*?)\[\*\]: ?(.* ...

  5. python split 正则_Python 正则表达式:split

    作用:用正则表达式的字符分割字符串,正则的字符会被抛弃. 本文以 提取URL的地址与参数 为例,介绍re模块的split的用法: 返回值 -> 列表 复杂匹配 = re.compile(正则表达 ...

  6. python compile正则_Python 正则表达式:compile

    本文以匹配×××ID为例,介绍re模块的compile与match的用法 复杂匹配 = re.compile(正则表达式): 将正则表达式实例化 + re.match(要匹配的字符串): 从字符串开 ...

  7. 菜鸟教程python正则表达式_python 正则表达式详解

    python 正则表达式详解 1. 正则表达式模式 模式描述 ^ 匹配字符串的开头 $ 匹配字符串的末尾. . 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字 ...

  8. python re模块_python 正则表达式 (重点) re模块

    京东的注册页面,打开页面我们就看到这些要求输入个人信息的提示. 假如我们随意的在手机号码这一栏输入一个11111111111,它会提示我们格式有误. 这个功能是怎么实现的呢? 假如现在你用python ...

  9. python表达式计算器_Python正则表达式实现简易计算器功能示例

    本文实例讲述了Python正则表达式实现简易计算器功能.分享给大家供大家参考,具体如下: 需求:使用正则表达式完成一个简易计算器. 功能:能够计算简单的表达式. 如:1*2*((1+2)/(2+3)+ ...

  10. python正则匹配_Python正则表达式初识(五)

    原标题:Python正则表达式初识(五) 正则表达式的内容很丰富,今天小编继续给大家分享Python正则表达式的基础知识.今天要给大家的讲的特殊字符是竖线"|".竖线"| ...

最新文章

  1. Dijkstra算法(C语言)
  2. 正确解读free -m
  3. 【ios开发】图片拉伸
  4. 关于使用spring管理hibernate,能够管理事务,却不执行除查询外的增删改操作,不能让数据库数据改变的原因
  5. vb怎么抓取html的class,vbs怎么获取网页内容
  6. ML.NET 示例:搜索引擎结果排名
  7. MiningZhiDaoQACorpus,580万百度知道问题,980万问答对数据挖掘项目
  8. setState的异步,同步以及合并
  9. 如何安全地迁移到Exchange 2003?
  10. div内容过长自动省略号
  11. Linux系统(简介、文件管理、常用命令、账号管理、c开发工具)
  12. java ssm商城_SSM网上购物商城系统
  13. 宏基4752g linux驱动下载,宏基4752g显卡驱动
  14. GAMIT处理GLONASS数据
  15. 从键盘上获取英文字符并转换大小写(C语言) 9.25
  16. 传感器技术—湿敏电阻式传感器(学习笔记五)
  17. java爆炸图片切换,JavaScript实现爆炸碎片的 图片切换 效果
  18. 计算机维修工程师认证,计算机维修工程师认证模拟试题.doc
  19. 苹果删除照片不释放内存_原来苹果手机这样清理内存,可以释放大量空间,真是太好用了...
  20. adb命令启动某个action_各种启动命令

热门文章

  1. python mysqldb insert_Python MySQLdb 插入数据
  2. kibana Percentile Ranks计算的逻辑
  3. 使用 paddlehub的人物识别 对游戏人物识别 绘制方框
  4. 计算机基础课件音乐,中考音乐资料电脑基础知识IT计算机专业资料-中考音乐资料.pdf...
  5. 字节跳动智力题-推理题
  6. Java为PDF文档加密
  7. vue中重复设置定时器导致时间加速
  8. php链路追踪molten
  9. stm32模数转换程序设计c语言,STM32 ADC模数转换简介
  10. ToDoList中文版(任务管理软件)v7.1.5.0