zoukankan      html  css  js  c++  java
  • Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法

    1. 使用find()方法

    >>> text = 'yeah, but no, but yeah, but no, but yeah'

    >>> text.find('no')
    10

    2. 使用re.match()

    对于复杂的匹配需要使用正则表达式和re 模块。为了解释正则表达式的基本原理,假设想匹配数字格式的日期字符串比如11/27/2012 ,可以这样做:
    >>> text1 = '11/27/2012'
    >>> text2 = 'Nov 27, 2012'
    >>>
    >>> import re
    >>> # Simple matching: d+ means match one or more digits
    >>> if re.match(r'd+/d+/d+', text1):
    ... print('yes')
    ... else:
    ... print('no')
    ...
    yes
    >>> if re.match(r'd+/d+/d+', text2):
    ... print('yes')
    ... else:
    ... print('no')
    ...
    no

    3.将字符串预编译re.compile(),再match()

    如果想使用同一个模式去做多次匹配,应该先将模式字符串预编译为模式对象。比如:
    >>> datepat = re.compile(r'd+/d+/d+')
    >>> if datepat.match(text1):
    ... print('yes')
    ... else:
    ... print('no')
    ...
    yes
    >>> if datepat.match(text2):

    ... print('yes')
    ... else:
    ... print('no')
    ...
    no

    4.使用findall()方法

    match() 总是从字符串开始去匹配,如果你想查找字符串任意部分的模式出现位置,使用findall() 方法去代替。比如:
    >>> text = 'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> datepat.findall(text)
    ['11/27/2012', '3/13/2013']

    5. .group()方法去捕获分组


    在定义正则式的时候,通常会利用括号去捕获分组。比如:
    >>> datepat = re.compile(r'(d+)/(d+)/(d+)')
    捕捕获分组可以使得后面的处理更加简单,因为可以分别将每个组的内容提取出来。
    比如:
    >>> m = datepat.match('11/27/2012')
    >>> m
    <_sre.SRE_Match object at 0x1005d2750>
    >>> # Extract the contents of each group
    >>> m.group(0)
    '11/27/2012'
    >>> m.group(1)
    '11'
    >>> m.group(2)
    '27'
    >>> m.group(3)
    '2012'
    >>> m.groups()
    ('11', '27', '2012')
    >>> month, day, year = m.groups()

     >>> text
    'Today is 11/27/2012. PyCon starts 3/13/2013.'
    >>> datepat.findall(text)
    [('11', '27', '2012'), ('3', '13', '2013')]
    >>> for month, day, year in datepat.findall(text):
    ... print('{}-{}-{}'.format(year, month, day))
    ...
    2012-11-27
    2013-3-13

    6. 迭代方式返回finditer()

    findall() 方法会搜索文本并以列表形式返回所有的匹配。如果你想以迭代方式返

    >>> for m in datepat.finditer(text):
    ... print(m.groups())
    ...
    ('11', '27', '2012')
    ('3', '13', '2013')

    核心步骤就是先使用re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法。

    7. 精确匹配

    如果你想精确匹配,确保你的正则表达式以$ 结尾,就像这么这样:
    >>> datepat = re.compile(r'(d+)/(d+)/(d+)$')
    >>> datepat.match('11/27/2012abcdef')
    >>> datepat.match('11/27/2012')
    <_sre.SRE_Match object at 0x1005d2750>
    >>>

    8.简单的文本匹配/搜索

    最后,如果你仅仅是做一次简单的文本匹配/搜索操作的话,可以略过编译部分,直接使用re 模块级别的函数。比如:
    >>> re.findall(r'(d+)/(d+)/(d+)', text)
    [('11', '27', '2012'), ('3', '13', '2013')]
    >>>
    但是需要注意的是,如果你打算做大量的匹配和搜索操作的话,最好先编译正则表达式,然后再重复使用它。模块级别的函数会将最近编译过的模式缓存起来,因此并会消耗太多的性能,但是如果使用预编译模式的话,将会减少查找和一些额外的处理损耗

     

  • 相关阅读:
    更新 anaconda
    spyder 每次运行前,清除上一次运行的变量
    vscode 无法使用 jupyter notebook
    vscode 关闭当前光标所在变量自动高亮
    vscode 关闭侧边栏中 git source control 的更改数目
    【java】Java组件概览(1)
    【java】字符串处理技巧记录
    【异常处理】Spring项目异常如何做异常处理
    【Springboot】Springboot学习(转)
    【微服务】微服务(转)
  • 原文地址:https://www.cnblogs.com/baxianhua/p/8444232.html
Copyright © 2011-2022 走看看