`

Python正则式初探

阅读更多

先介绍下最常见的元字符metacharacter:

literal      匹配字符串的值    foo

re1|re2   匹配正则式re1或re2    foo|bar

.              匹配一个任何字符(换行符除外)  b.b

^              匹配字符串开始           ^Dear

$             匹配字符串结束            /bin/*sh$

*              匹配前面出现的零次或多次      [A-Za-z0-9]*

+             匹配前面出现的一次或多次       [a-z]+\.com

?             匹配前面出现的零次或一次       goo?

{N}          匹配前面出现的正则式N次         [0-9]{3}

{M,N}       匹配前面出现的M次到N次         [0-9]{5,9}

[...]          匹配字符组里出现任意一个字符        [aeiou]

[...x-y...]   匹配从字符x到y中的任意一个字符     [A-Za-z]

[^...]         匹配不在字符集中的任意一个字符     [^A-Za-z]

(*|+|?|{})? 用于上面出现的任何“非贪婪”版本重复匹配次数         .*?[a-z]

(...)          匹配封闭括号中的正则式,并保存为子组         ([0-9]{3})?

 

接下来再介绍几个特殊字符:

\d            匹配任何一个数字字符,和[0-9]一样,\D是\d的反义词,表示任何一个非数字字符       data\d+\.txt

\w            匹配任何一个数字字母下划线字符,和[A-Za-z0-9_]相同,\W跟\w相反      [A-Za-z_]\w+

\s             匹配任何一个空白符,和[\n\t\r\v\f ]相同, \S是\s的反义

\b             匹配单词边界,\B是\b的反义          \bThe\b

\nn           匹配已保存的子组          price:\16

\c             逐一匹配特殊字符c,即取消它的特殊含义,按字面匹配    \.    \\,    \*

\A(\Z)       匹配字符串的起始(结束),跟^$是意义一样

 

再用一张图解释全部:


 

★ re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。

第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。

另外,你也可以在regex字符串中指定模式,

比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。

可选值有:

    re.I(全拼:IGNORECASE): 忽略大小写(括号内是完整写法,下同)

   re.M(全拼:MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)

    re.S(全拼:DOTALL): 点任意匹配模式,改变'.'的行为

    re.L(全拼:LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定

    re.U(全拼:UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性

    re.X(全拼:VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。 

 

解释下“非贪婪”匹配?

当表示重复次数的元字符(*+?{m,n})单独使用时会尽量吸收更多的字符,一直吸到不匹配为止,榨干你丫的。哈哈哈。

而上面的(*+?{m,n})后面接了?后,就表示非贪婪匹配,匹配最短的,留下尽可能多的字符给后面的模式(如果存在)。

 

 使用compile()编译正则表达式后,将正则式模式编译成regex对象,以后重复使用这个对象的时候可以提升执行的性能。

 

m = re.match('\w\w\w-\d\d\d', 'abc-123')
if m is not None:
    print(m.group())
m = re.match('\w+\w+\w+-\d\d\d', 'abc-123')
if m is not None:
    print(m.group())
m = re.match('\w+?\w+?\w+?-\d\d\d', 'abc-123')
if m is not None:
    print(m.group())

 

哥原本以为那啥\w+会做贪婪匹配,弄的后面的两个\w+没得匹配,但是三个结果都一样啊。神马原因?

请看下面的:

m = re.match(r'(\w+)(\w+)(\w+)-\d\d\d', 'abcdefgh-123')
if m is not None:
    print(m.group())
    print(m.group(1))
    print(m.group(2))

 输出:

abcdefgh-123

abcdef

g

贪婪算法是:我前面的尽可能多的匹配更多,但是我会保证后面的也能匹配的前提下,自己捞的越多越好,这个就跟贪官一样,反正我给后面的那些平民百姓保本的东西,让他们饿不死就行,自己捞的越多越好,真他吗的黑心啊。

所以第一组中的(\w+)匹配了abcdef,留下两个gh给后面去抢。每人分一个,最小满足后面的。

 

来来来,再看几个例子:

 

import re
__author__ = 'Xiong Neng'

# group示例
data = 'Thu'
patt1 = r'^(\w{3})'
m = re.match(patt1, data)
print(m.group(1))
patt2 = r'^(\w){3}'
m = re.match(patt2, data)
print(m.group(1))

# 贪婪匹配
data = "Sat Mar 21 09:20:57 2009::spiepu@ovwdmrnuw.com::1237598457-6-9"
# 获取最后的那三个连字符连起来的三个数,
# 搜索比匹配更合适,因为不在开头
patt = r'\d+-\d+-\d+'
print(re.search(patt, data).group())  # 打印出  1237598457-6-9
# 使用匹配,必须用到group
patt = r'.+(\d+-\d+-\d+)'
print(re.match(patt, data).group(1))  # 打印出  7-6-9,知道贪婪的厉害了吧。哈哈
# 接下来使用非贪婪操作符?
patt = r'.+?(\d+-\d+-\d+)'
print(re.match(patt, data).group(1))  # 打印出  1237598457-6-9
# 只获取三个数的中间那个数字:
patt = r'-(\d+)-'
print(re.search(patt, data).group())   # 打印-6-
print(re.search(patt, data).group(1))  # 打印6

# 建议阅读Jeffrey E. F. Friedl编写的《精通正则表达式》(Mastering Regular Expression)

 

最后是几个小练习:

# 匹配所有整形字符串
patt = r'\d+'
# 匹配长整形
patt = r'\d+[lL]'
# 匹配浮点型
patt = r'(-?(\d+\.\d*|\d*\.\d+))([eE]-?\d+)?'
print(re.match(patt, '-.2e-22').group())
print(re.match(patt, '23.23056e-23').group())
# 匹配所有复数
patt = r'(-?(\d+\.\d*|\d*\.\d+))([eE]-?\d+)?\s*[+-]\s*(\d+\.\d*|\d*\.\d+)([eE]-?\d+)?[jJ]'
print(re.match(patt, '-.2e-22   -   32.E21J').group())
print(-.2e-22    -    32.E21J)

 

本人博客已搬家,新地址为:http://www.pycoding.com/

  • 大小: 185.4 KB
分享到:
评论

相关推荐

    python学习教程2023

    01解释型脚本语言初探 02Python开发环境 03python使用基础 04python内置容器 05并行开发 06python正则表达式 07socket编程基础

    python基础教程至60课(基础)

    #### Python第25课:初探List - **列表基础知识**:介绍列表的基本概念、创建方法及基本操作。 #### Python第26课:操作List - **列表操作**:深入讨论列表的各种操作,如追加元素、删除元素、排序等。 #### ...

    python学习笔记与简明教程

    #### Python 第25课:初探list - **知识点**: - 列表的基本概念。 - 列表的创建。 - 列表索引与切片。 - 示例代码演示列表的基本操作。 #### Python 第26课:操作list - **知识点**: - 列表的基本操作方法。...

    Python基础教程60课

    - **【Python第25课】初探list** 列表是Python中的一种容器数据类型。本课将介绍列表的基本操作。 - **【Python第26课】操作list** 进一步探讨列表的操作,如排序、反转等。 - **【Python第28课】字符串的分割...

    patyon爬虫技术PDF课件_爬虫_python_

    6. **06python正则表达式.pdf** - 正则表达式是爬虫中常用的文本匹配工具,这部分可能详细讲解如何使用Python的`re`模块进行字符串匹配、查找、替换等操作,这对于解析网页HTML、提取所需信息至关重要。 7. **07...

    Python基础教程(crossin全60课)

    - **【Python第25课】初探list** - **主要内容**:介绍Python中的列表数据类型。 - **知识点**: - 列表的创建与索引; - 列表元素的增删改查操作; - 列表与其他数据结构的区别。 - **【Python第26课】操作...

    python学习笔记与简明教程.docx

    #### Python 第25课:初探List - **知识点**: - 列表的基本概念与创建 - 列表的主要操作(增删改查) - 列表与其他数据结构的区别 #### Python 第26课:操作List - **知识点**: - 列表元素的索引与切片 - ...

    Beginning Python Using Python 2.6 and Python 3.1 - James W. Payne.pdf )

    ### 第一部分:初探Python #### 第1章:编程基础知识与字符串 本章为读者提供了Python编程的基础概念,包括语法结构、变量类型以及如何处理文本数据。通过讲解字符串的创建、操作和格式化,帮助读者建立对Python...

    python基础

    #### Python第25课:初探list - **知识点**: - 列表(List)的数据结构特性。 - 如何创建和初始化列表。 - 列表的基本操作,如索引访问、切片等。 #### Python第26课:操作list - **知识点**: - 列表的操作...

    python免费视频教程(初高中级)+基础教程.docx

    #### Python 第25课:初探list - **知识点介绍**:介绍列表的基本概念和操作方法。 - **实操要点**:创建和操作列表,实现基本的数据存储功能。 #### Python 第26课:操作list - **知识点介绍**:进一步探讨列表的...

    python基础教程

    #### Python第25课:初探list - **知识点**: - 列表的基本概念及其创建方法。 - 列表的基本操作,如追加、插入等。 - 列表的索引与切片操作。 #### Python第26课:操作list - **知识点**: - 更多关于列表的...

    python基础教程至60课(基础).docx

    #### Python第25课:初探list - **知识点概述**:介绍列表数据类型的基础知识。 - **详细内容**:列表是一种有序的、可变的数据集合。可以通过方括号`[]`创建列表。列表支持多种操作,如索引、切片等。 #### Python...

    3. Django 初探路由

    `path()`用于简单的路径匹配,而`re_path()`支持正则表达式,可以处理更复杂的模式。 ```python # myapp/urls.py from django.urls import path from . import views urlpatterns = [ path('index/', views.index...

    爬虫技术初探

    对于复杂网页的元素定位,正则表达式和XPath是常用的技术。XPath是一种在XML文档中查找信息的语言,它可以精确定位到页面中的特定元素。 网页调试和抓包工具是爬虫开发过程中的必备工具。例如,F12是浏览器自带的...

    爬虫 (2).zip

    【爬虫技术初探:Python实现简单爬虫】 爬虫是一种自动抓取互联网信息的程序,它能够遍历网页、提取数据,为数据分析、信息检索等任务提供便利。本资源包含一个简单的Python爬虫案例,旨在帮助初学者快速入门爬虫...

    CUHKSZ-CSC1001

    《CUHKSZ-CSC1001:Python编程初探》 CUHKSZ-CSC1001,这是一门与计算机科学基础相关的课程,重点在于教授Python编程语言。Python,作为当今世界上最受欢迎的编程语言之一,以其简洁、易读的语法和强大的功能吸引了...

    蜘蛛

    【标题】:“蜘蛛”——网页爬虫初探 【描述】:“由于项目需要,寒假花一礼拜学了下爬虫,在此记录!2021年3月3日海成科技” 在信息技术高速发展的今天,数据采集成为了一个重要的任务。其中,网页爬虫作为一种...

Global site tag (gtag.js) - Google Analytics