Python preg_match_all Uygulanması

3 Cevap php

Ben temelde bir Python şekilde PHP preg_match_all() aynı işlevselliği istiyorum.

Ben bir regex desen ve bir dize varsa, dize arama ve sesli harf her oluşum bir sözlük geri almak için bir yol dizesindeki konumuna birlikte, var mı?

Örnek:

s = "supercalifragilisticexpialidocious"

Dönecekti:

{
  'u' : 1,
  'e' : 3,
  'a' : 6,
  'i' : 8,
  'a' : 11,
  'i' : 13,
  'i' : 15
}

vs ..

3 Cevap

Birden fazla özdeş tuşları bulunuyor beri ne isteyebilir, bir sözlük olamaz. Ancak, bu gibi dizilerini listede koyabilirsiniz:

>>> [(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)]

Sen faster regexp olmadan yapabilirsiniz

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

Here are some timings:
For 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 For

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

Bunun gibi, örneğin:

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 sadece örtüşmeyen eşleşmeleri bulur unutmayın. Ve dict tuşları üzerine olacak, böylece ilk maçı istiyorsanız, tarafından içteki döngü değiştirmeniz gerekir:

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