代码之家  ›  专栏  ›  技术社区  ›  st_dec

使用正则表达式[复制]提取日期

  •  0
  • st_dec  · 技术社区  · 5 年前

    如果我这样做,我如何访问捕获的组 findall(r'regex(with)capturing.goes.here') ? 我知道我能做到 finditer ,但我不想重复。

    0 回复  |  直到 15 年前
        1
  •  116
  •   Eli Bendersky    15 年前

    findall 只返回捕获的组:

    >>> re.findall('abc(de)fg(123)', 'abcdefg123 and again abcdefg123')
    [('de', '123'), ('de', '123')]
    

    相关文件摘录:

    返回以下所有不重叠的匹配项 字符串中的模式,作为列表 串。字符串已被扫描 从左到右,比赛是 按照找到的顺序返回。如果一个或 更多的组存在于 pattern,返回组列表;这 如果满足以下条件,则将是一个元组列表 模式有多个组。空 比赛结果中包括 除非他们触及了开始 另一场比赛。

        2
  •  41
  •   bluepnume    15 年前

    自由使用群组。匹配结果将以组元组列表的形式返回:

    >>> re.findall('(1(23))45', '12345')
    [('123', '23')]
    

    如果你想包含完整的匹配项,只需将整个正则表达式括在一个组中:

    >>> re.findall('(1(23)45)', '12345')
    [('12345', '23')]
    
        3
  •  3
  •   Mona Jalal    10 年前
    import re
    string = 'Perotto, Pier Giorgio'
    names = re.findall(r'''
                     (?P<first>[-\w ]+),\s #first name
                     (?P<last> [-\w ]+) #last name
                     ''',string, re.X|re.M)
    
    print(names)
    

    退货

    [('Perotto', 'Pier Giorgio')]
    

    re.M 如果你的字符串是多行的,这是有道理的。你还需要 VERBOSE (等于 re.X )我编写的正则表达式中的模式是因为它使用 '''

        4
  •  0
  •   Tim Pietzcker    15 年前

    有几种可能的方法:

    >>> import re
    >>> r = re.compile(r"'(\d+)'")
    >>> result = r.findall("'1', '2', '345'")
    >>> result
    ['1', '2', '345']
    >>> result[0]
    '1'
    >>> for item in result:
    ...     print(item)
    ...
    1
    2
    345
    >>>