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

不同的行为重新查找以及关于芬德尔

  •  15
  • simao  · 技术社区  · 14 年前

    CARRIS_REGEX=r'<th>(\d+)</th><th>([\s\w\.\-]+)</th><th>(\d+:\d+)</th><th>(\d+m)</th>'
    pattern = re.compile(CARRIS_REGEX, re.UNICODE)
    matches = pattern.finditer(mailbody)
    findall = pattern.findall(mailbody)
    

    我怎样才能让芬迪特和芬德尔表现得一样?

    4 回复  |  直到 14 年前
        1
  •  38
  •   Tim Pietzcker    9 年前

    我不能在这里复制这个。我已经在Python2.7和3.1中尝试过了。

    finditer findall 前者返回regex match对象,而另一个返回匹配捕获组的元组(如果没有捕获组,则返回整个匹配)。

    所以呢

    import re
    CARRIS_REGEX=r'<th>(\d+)</th><th>([\s\w\.\-]+)</th><th>(\d+:\d+)</th><th>(\d+m)</th>'
    pattern = re.compile(CARRIS_REGEX, re.UNICODE)
    mailbody = open("test.txt").read()
    for match in pattern.finditer(mailbody):
        print(match)
    print()
    for match in pattern.findall(mailbody):
        print(match)
    

    印刷品

    <_sre.SRE_Match object at 0x00A63758>
    <_sre.SRE_Match object at 0x00A63F98>
    <_sre.SRE_Match object at 0x00A63758>
    <_sre.SRE_Match object at 0x00A63F98>
    <_sre.SRE_Match object at 0x00A63758>
    <_sre.SRE_Match object at 0x00A63F98>
    <_sre.SRE_Match object at 0x00A63758>
    <_sre.SRE_Match object at 0x00A63F98>
    
    ('790', 'PR. REAL', '21:06', '04m')
    ('758', 'PORTAS BENFICA', '21:10', '09m')
    ('790', 'PR. REAL', '21:14', '13m')
    ('758', 'PORTAS BENFICA', '21:21', '19m')
    ('790', 'PR. REAL', '21:29', '28m')
    ('758', 'PORTAS BENFICA', '21:38', '36m')
    ('758', 'SETE RIOS', '21:49', '47m')
    ('758', 'SETE RIOS', '22:09', '68m')
    

    如果你想从 芬迪特 当你从 ,你需要

    for match in pattern.finditer(mailbody):
        print(tuple(match.groups()))
    
        2
  •  6
  •   tzot    14 年前

    finditer ,则可以使用列表理解:

    >>> [match for match in pattern.finditer(mailbody)]
    [...]
    

    for 循环以访问 re.finditer :

    >>> for match in pattern.finditer(mailbody):
    ...     ...
    
        3
  •  6
  •   Chankey Pathak    7 年前

    findall()返回字符串中模式的所有非重叠匹配 作为字符串列表。

    finditer()返回 可调用对象 .

    按找到的顺序返回匹配项。

        4
  •  5
  •   Kushan Gunasekera    6 年前

    我从 Regular expression operations 在里面 Python 2.* Documentation

    text = "He was carefully disguised but captured quickly by police."
    

    compile 将正则表达式模式键入为,

    regEX = r"\w+ly"
    pattern = re.compile(regEX)
    

    \w 匹配任何单词字符(字母数字和下划线) , + 匹配前面的一个或多个标记 整个意思是 选择任何以 ly . 只有两个词(“小心”和“迅速”)满足上述正则表达式。

    搬入前 re.findall() re.finditer() ,让我们看看 re.search() 平均值 Python 2.*文档

    下面的代码行让您基本了解

    search = pattern.search(text)
    print(search)
    print(type(search))
    
    #output
    <re.Match object; span=(7, 16), match='carefully'>
    <class 're.Match'>
    

    它会产生 re.MatchObject 类类型的对象,根据 . 这个 span() 方法与中匹配字的起点和终点(上例中的7和16)一致 text 检索() 方法只考虑第一个匹配,否则返回 None

    让我们进入这个问题,在那之前看看有什么用 重新查找() Python 2.*文档 .

    接下来的代码行将让您基本了解 重新查找()

    finditer = pattern.finditer(text)
    print(finditer)
    print(type(finditer))
    
    #output
    <callable_iterator object at 0x040BB690>
    <class 'callable_iterator'>
    

    上面的例子给了我们 Iterator Objects 需要循环。这显然不是我们想要的结果。让我们循环一下 finditer 看看里面是什么 .

    for anObject in finditer:
        print(anObject)
        print(type(anObject))
        print()
    
    #output
    <re.Match object; span=(7, 16), match='carefully'>
    <class 're.Match'>
    
    <re.Match object; span=(40, 47), match='quickly'>
    <class 're.Match'>
    

    检索() 我们之前得到的结果。但是我们可以从上面的输出中看到新的结果, <re.Match object; span=(40, 47), match='quickly'> . 正如我前面提到的 Python 2.*文档 , 重新查找() 扫描字符串,查找正则表达式模式生成匹配项的所有位置 关于芬德尔()

    这是什么 关于芬德尔() Python 2.*文档

    以字符串列表的形式返回字符串中模式的所有非重叠匹配。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,则返回元组列表。结果中包含空匹配项。

    让我们来了解下发生了什么 关于芬德尔()

    findall = pattern.findall(text)
    print(findall)
    print(type(findall))
    
    #output
    ['carefully', 'quickly']
    <class 'list'>
    

    这个输出只给我们中匹配的单词 变量,否则返回空值 list 列表 在输出中类似于 match 中的属性

    这是完整的代码,我试过了 Python 3.7

    import re
    
    text = "He was carefully disguised but captured quickly by police."
    
    regEX = r"\w+ly"
    pattern = re.compile(regEX)
    
    search = pattern.search(text)
    print(search)
    print(type(search))
    print()
    
    findall = pattern.findall(text)
    print(findall)
    print(type(findall))
    print()
    
    finditer = pattern.finditer(text)
    print(finditer)
    print(type(finditer))
    print()
    for anObject in finditer:
        print(anObject)
        print(type(anObject))
        print()