返回顶部
首页 > 资讯 > 后端开发 > Python >python中对正则表达式re包的简单引用方式
  • 423
分享到

python中对正则表达式re包的简单引用方式

2024-04-02 19:04:59 423人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录对正则表达式re包的简单引用一、re.match(pattern,string,flags=0)二、re.search(pattern,string,flags=0)三、检索和替

对正则表达式re包的简单引用

正则表达式一直是被我所忽略的东西,因为在之前的学习开发中基本很少用到它。而且,之前学习正则表达式时感觉很懵逼,所以毅然决然的放弃了(QAQ),然而出来混总归还是要还的。最近在弄日志处理时,必须用到正则表达式,这就让我不得不拿起正则表达式了。在此记录一些自己学习的笔记与案例。

python中导入re包

import re  

一、re.match(pattern,string,flags=0)

尝试从字符串 开始 位置(看清楚,开始位置!!!)匹配一个模式。成功则返回一个match对象,失败则是none

参数说明:

  • pattern:正则表达式
  • string:字符串
  • flags:可选标志位

注:可选标志在下面简单说明

获取对象的方法:

使用group(num)  来获取对象小组内的内容。

举例:

#_*_coding:utf8_*_
import re 
str1='010-011-110'
pattern = r'\d{3}-\d{3}-\d{3}'
match = re.match(pattern,str1)
print match.group()
print match.group(0)
print match.group(1)
print match.group(2)
print match.group(3)
 
#输出为:
010-011-110
010-011-110
010
011
110

match()方法最重要的一点就是它是从字符串开始匹配的,切记这一点······我已经在这点上犯了很多错误了。

在写简单的正则表达式的时候我们可以用()来进行分组,以便于我们在后续处理中取值。后续也会谈到通过命名捕获的方式来取值。

二、re.search(pattern,string,flags=0)

跟match函数参数一样,它也是用来匹配字符串的。而最大的不同在于它可以从字符串的任意位置匹配,不像match一样,仅限于从字符串开始位置。参数跟match一样,就不做说明了,直接上例子。

#与match例子不同,001前面有很多空格
str1='    001-010-110'
#与match中的模式一样
pattern = r'\d{3}-\d{3}-\d{3}'
#若此时用match()函数,结果肯定是不匹配的。
search = re.search(pattern,str1)
print search.group()
print search.group(0)
print search.group(1)
print search.group(2)
print search.group(3)
 
#结果:
001-010-110
001-010-110
001
010
110

对于match和search,还是得说一遍,注意一个必须是从字符串开始处匹配,一个是任意位置。

三、检索和替换 re.sub()

用于替换字符串中的匹配项

re.sub(pattern,repl,string,count,flags)

参数说明:

  • pattern:正则表达式
  • repl:替换的字符串,可为一个函数
  • string:要被查找的原始字符串
  • count:被替换的次数,默认替换所有匹配项
  • flags:标志位      
#_*_coding:utf-8_*_
import re 
phone = "888-7777-6666 #好牛的号码
#删除字符串中的注释
num = re.sub(r'#.*','',phone)
print num
#删除注释和-
realphone = re.sub(r'\D','',phone)
print realphone
#结果为:
888-7777-6666
88877776666

sub函数理解起来不难,但要主要的是在repl参数的使用。repl可以为一个函数。例如:

将字符串中的数字乘以二

def double(match):
    value = int(match.group('value'))
    return str(value*2)
s='APPLE23EFG567'
print re.sub(r'(?P<value>\d+)',double,s)
 
#结果为:
 APPLE46EFG1134

因为repl为一个函数,所以再替换的时候会替换为函数的返回值。

注:?P<value>为正则表达式的命名捕获,在下面将会做简单记录

四、正则表达式之命名捕获

格式为: ?P<name>

在处理字符串取值时往往会用到

例子:

num = '001-010-110'
pattern = r'(\d{3})-(\d{3})-(\d{3})'
match = re.match(pattern,num)
print match.group()       #001-010-110
print match.group(1)      #001
print match.group(2)      #010
print match.group(3)      #110

在上述例子要分别获取每项的值就要使用group(num),而当正则表达式变得复杂的时候,再用num取值时,很有可能会取到错误的值。所以就提出使用命名捕获,下面为简单例子:

pattern = r'(?P<Area>\d{3})-(?P<zhong>\d{3})-(?P<wei>\d{3})'
match = re.match(patter, num)
 
print match.group('Area')     #001
print match.group('zhong')    #010
print match/group('wei')      #110

虽然在上述例子中使用命名捕获会将降低正则表达式的可读性,但命名捕获咋复杂的正则中,会准确获取想要的值(当然,正则肯定得写准确啊·····)

re库的正确使用姿势

前提假设:

  • 已经充分掌握PCRE风格正则表达式
  • 熟读re库文档

Why

正则表达式的强大已不用我赘述,Python 对此的支持也是十分强大,只不过:

re.search(pattern, string, flags=0)
re.match(pattern, string, flags=0)
......

你能很麻利地使用如上所示的一系列模块级别function 吗,如果你天天用 Python 搞正则匹配,相信你一定很熟练。但是如果你需要每次临时翻阅文档才能知道如何使用它,那么就要思考:是不是 api 在某种程度上设计不好了(有的语言的 pattern 极有可能不是放在首位)。

一般来说,API 的接口参数越少越好,最好的就是没有参数,调用者无脑调用,没有任何记忆负担。而 Python 的 re 库,在我看来,应该至少糅合了「命令式」与「OOP」两种风格,而且接口也不「最小化,正交」。

使用姿势

正确的姿势应该是:只用 OOP 风格,并且完全忘记 re 库提供的一系列模块级别的 function (如 re.search, re.match等)。

首先是每次都构造出 Regex 对象,然后由 Regex 对象得出 Match 对象,然后在 Regex 对象和 Match 对象上进行一系列操作。比如:

# 1. 构造
    REGEX = re.compile($pattern, flags)     flags是re模块的常量
 
# 2. 获取 MatchObject
    m = regex.search(string)
   
# 3. 后续 MatchObject 的使用
    1. 获取分组  group()    
    2. groups
    3. groupdict()

应用举例

比如我在自己构造的 PathUtils 中,就是如此使用的(我非常喜欢各种各样的 Utils ):

from __future__ import (absolute_import, unicode_literals) 
import re 
class PathUtils(object):
    """路径操作的工具函数"""
 
    _linux_ROOT = '/'
    _LINUX_PATH_SPLITOR = '/'
 
    @claSSMethod
    def is_two_linux_path_contains(cls, path1, path2):
        """两个Linux路径是否存在互相包含关系"""
 
        if path1 == cls._LINUX_ROOT or path2 == cls._LINUX_ROOT:
            return True
 
        path1_split = path1.split(cls._LINUX_PATH_SPLITOR)
        path2_split = path2.split(cls._LINUX_PATH_SPLITOR)
 
        for item1, item2 in zip(path1_split, path2_split):
            if item1 != item2:
                return False 
        return True
 
    @classmethod
    def is_valid_linux_path(cls, path):
        if not path:
            return False
 
        LINUX_PATH_REGEX = r'^(/[^/ ]*)+/?$' 
        return cls.is_valid_pattern(path, LINUX_PATH_REGEX)
 
    @classmethod
    def is_valid_windows_path(cls, path):
        if not path:
            return False
 
        WINDOWS_PATH_REGEX = r'^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$' 
        return cls.is_valid_pattern(path, WINDOWS_PATH_REGEX)
 
    @classmethod
    def is_valid_path(cls, p):
        if not p:
            return False
 
        return cls.is_valid_linux_path(p) or cls.is_valid_windows_path(p)
 
    @classmethod
    def is_valid_pattern(cls, value, pattern):
        if not value:
            return False
 
        REGEX = re.compile(pattern, re.UNICODE) 
        m = REGEX.match(value) 
        return True if m else False

主要的功能函数就是:

@classmethod
def is_valid_pattern(cls, value, pattern):
    if not value:
        return False 
    REGEX = re.compile(pattern, re.UNICODE) 
    m = REGEX.match(value) 
    return True if m else False

这样一系列流程下来,我的感受就是,re 库的接口没有需要记忆,也没有需要临时翻阅文档的地方,并且我只用这一种风格(自己熟悉的,效率总是最高的),比如 re.compile肯定只需要传一个参数(flags不是必要的),REGEX_OBJ.match/search肯定只需要传need_search_string即可。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: python中对正则表达式re包的简单引用方式

本文链接: https://lsjlt.com/news/138614.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python中对正则表达式re包的简单引用方式
    目录对正则表达式re包的简单引用一、re.match(pattern,string,flags=0)二、re.search(pattern,string,flags=0)三、检索和替...
    99+
    2024-04-02
  • python中怎么对正则表达式re包进行引用
    这篇文章主要介绍“python中怎么对正则表达式re包进行引用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python中怎么对正则表达式re包进行引用”文章能帮助大家解决问题。对正则表达式re包的...
    99+
    2023-06-29
  • Python正则表达式 re(regul
    1. 点..: 代表一个字符 (这个跟linux的正则表达式是不同的,那里.代表的是后面字符的一次或0次出现)2. 转义\\或者r'\': 如 r'python\.org' (对.符号的转义)3. ^ 非或叫做排除如[^abc]: 任何以非...
    99+
    2023-01-31
    正则表达式 Python regul
  • Python 08 re 正则表达式
    . 匹配除换行符以外的任意字符\w 匹配字母或数字或下划线或汉字\s 匹配任意的空白符\d 匹配数字\b 匹配单词的开始或结束^ 匹配字符串的开始$ 匹配字符串的结束 代码/语法 说明* 重复零次或更多次+ 重复一次或更多次 重复零次或一次...
    99+
    2023-01-31
    正则表达式 Python
  • Python中的re正则表达式模块
    一、re模块的基本使用 Python里数量词默认是贪婪的,总是尝试匹配尽可能多的字符。正则表达式是用来匹配处理字符串的。 假如你需要匹配文本中的字符\,Python里的使用原生字符串...
    99+
    2024-04-02
  • python re模块 正则表达式
    导航: 1、正则表达式元字符2、预定义字符集3、re模块常用函数4、注意事项 正则表达式在很多语言里都支持,python也不例外,re模块就是正则表达式的应用 正则表达式对字符串的逻辑操作,主要是对字符串的一种过滤,用“元字符” 与“普通...
    99+
    2023-01-30
    模块 正则表达式 python
  • python正则表达式模块re
    正则表达式的特殊元素 匹配符号 描述 '.'(点dot) 在默认模式下,它匹配除换行符之外的任何字符。如果指定了DOTALL标志,则匹配包括换行符在内的任何字符 '^'(Caret) 匹配以字符串开头,...
    99+
    2023-01-30
    模块 正则表达式 python
  • Python re正则表达式学习
    一、re.match re.match 尝试从字符串的开始匹配一个模式,如:下面的例子匹配第一个单词。 import re   text = "JGood is a handsome boy, he is cool, c...
    99+
    2023-01-31
    正则表达式 Python
  • python 关于正则表达式re
      1.正则表达式 re  典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。  通...
    99+
    2023-06-02
  • python3中的RE(正则表达式)-总
    1.引入正则模块(Regular Expression)     要使用python3中的RE则必须引入 re模块 import re #引入正则表达式 2.主要使用的方法 match(), 从左到右进行匹配 #pattern 为要校...
    99+
    2023-01-31
    正则表达式
  • python--模块之re正则表达式
    简介: 正则表达式本身是一个小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,我们可以通过直接调用来实现正则匹配。 正则表达式基础知识: --普通字符匹配自身 abc ----abc --元字符 . :匹...
    99+
    2023-01-30
    模块 正则表达式 python
  • python模块之re(正则表达式)
    匹配模式 re.ASCII同re.A,对应的内联标识为(a),用于向后兼容。使元字符\w, \W, \b, \B, \d, \D, \s和\S仅匹配ASCII字符。该模式只在string模式下有意义,在byte模式下将被忽略。 re.DE...
    99+
    2023-01-31
    模块 正则表达式 python
  • re正则表达式库的简介、入门、使用方法
      re正则表达式库的简介  正则表达式在很多语言里都支持,python也不例外,re模块就是正则表达式的应用 正则表达式对字符串的逻辑操作,主要是对字符串的一种过滤,用“元字符” 与“普通字符”组成一个字符串规则对已知的字符串或文本过滤出...
    99+
    2023-06-02
  • python re 正则表达式学习总结
    # -*- coding: utf-8 -*- import re import os #------------------------------------- re(正则表达式)模块 ------------------------...
    99+
    2023-01-31
    正则表达式 python
  • Python的re模块正则表达式操作
    这个模块提供了与 Perl 相似l的正则表达式匹配操作。Unicode字符串也同样适用。 正则表达式使用反斜杠" "来代表特殊形式或用作转义字符,这里跟Python的语法冲突,因此,Python用" \...
    99+
    2022-06-04
    模块 操作 正则表达式
  • python正则表达式re模块怎么使用
    这篇文章主要介绍“python正则表达式re模块怎么使用”,在日常操作中,相信很多人在python正则表达式re模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python正则表达式re模块怎么使用...
    99+
    2023-07-02
  • python正则表达式(re模块)的使用详解
    目录前言re.match函数匹配单个字符匹配多个字符匹配开头结尾匹配分组re.compile 函数re.search函数re.findall函数re.finditer函数re.sub...
    99+
    2024-04-02
  • python模块之re正则表达式详解
    一、简单介绍 正则表达式是一种小型的、高度专业化的编程语言,并不是python中特有的,是许多编程语言中基础而又重要的一部分。在python中,主要通过re模块来实现。 正则表达式模式被编译成一系列的字节码...
    99+
    2022-06-04
    详解 模块 正则表达式
  • python的正则表达式和re模块详解
    目录一、正则表达式基础二、python re模块三、进阶总结一、正则表达式基础 二、python re模块 注意:正则表达式 != re eg: 注意:如果返回的是对象,则需要...
    99+
    2024-04-02
  • python3正则表达式简单使用、sea
    raw string:转义字符’\’不解释为转义字符 re.search(pattern, string, flags=0) 返回匹配的match对象flags:正则表达式使用时的标记re.I->IGNORECASE 忽略正则的大...
    99+
    2023-01-31
    简单 正则表达式 sea
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作