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

在python中实现preg_match_all

  •  2
  • roflwaffle  · 技术社区  · 15 年前

    我基本上希望 preg_match_all() 以python的方式从php。

    如果我有一个regex模式和一个字符串,有没有一种方法可以搜索这个字符串,并得到一个每个元音出现的字典,以及它在字符串中的位置?

    例子:

    s = "supercalifragilisticexpialidocious"
    

    将返回:

    {
      'u' : 1,
      'e' : 3,
      'a' : 6,
      'i' : 8,
      'a' : 11,
      'i' : 13,
      'i' : 15
    }
    
    3 回复  |  直到 9 年前
        1
  •  5
  •   interjay    15 年前

    你要的不能是字典,因为它有多个相同的键。但是,您可以将它放入这样的元组列表中:

    >>> [(m.group(0), m.start()) for m in re.finditer('[aeiou]',s)]
    [('u', 1), ('e', 3), ('a', 6), ('i', 8), ('a', 11), ('i', 13), ('i', 15), ('i', 18), ('e', 20), ('i', 23), ('a', 24), ('i', 26), ('o', 28), ('i', 30), ('o', 31), ('u', 32)]
    
        2
  •  6
  •   John La Rooy    15 年前

    你可以做到这一点 更快 没有正则表达式

    [(x,i) for i,x in enumerate(s) if x in "aeiou"]
    

    以下是一些时间安排:
    为了 s = "supercalifragilisticexpialidocious"

    timeit [(m.group(0), m.start()) for m in re.finditer('[aeiou]',s)]
    10000 loops, best of 3: 27.5 µs per loop
    
    timeit [(x,i) for i,x in enumerate(s) if x in "aeiou"]
    100000 loops, best of 3: 14.4 µs per loop
    

    为了 s = "supercalifragilisticexpialidocious"*100

    timeit [(m.group(0), m.start()) for m in re.finditer('[aeiou]',s)]
    100 loops, best of 3: 2.01 ms per loop
    
    timeit [(x,i) for i,x in enumerate(s) if x in "aeiou"]
    1000 loops, best of 3: 1.24 ms per loop
    
        3
  •  0
  •   AndiDog    15 年前

    例如:

    import re
    
    def findall(pattern, string):
        res = {}
        for match in re.finditer(pattern, string):
            res[match.group(0)] = match.start()
        return res
    
    print findall("[aeiou]", "Test this thang")
    

    注意 re.finditer 只找到不重叠的匹配项。并且dict键将被覆盖,因此如果您想要第一个匹配项,则必须将最里面的循环替换为:

        for match in re.finditer(pattern, string):
            if match.group(0) not in res: # <-- don't overwrite key
                res[match.group(0)] = match.start()