Вы можете использовать положительный прогноз вперед (?=\.|\s)
, чтобы остановить совпадение в этом месте:
(?<=test\s:\s).*(?=\.|\s)
Два \s
в (?<=test\s:\s)
будут «обрезать» совпадение. Следите за .match()
, так как он будет искать только совпадение в начале строки (Авинаш алейди указал на это, но это очень важная нота!) [/ G3]
См. demo
import re
p = re.compile(ur'(?<=test\s:\s).*(?=\.|\s)')
test_str = u"test : match this."
print re.search(p, test_str).group()
ndindex
- удобный способ генерации индексов, соответствующих форме:
In [33]: arr = np.arange(36).reshape(4,3,3)
In [34]: for xy in np.ndindex((3,3)):
...: print(xy, arr[:,xy[0],xy[1]])
...:
(0, 0) [ 0 9 18 27]
(0, 1) [ 1 10 19 28]
(0, 2) [ 2 11 20 29]
(1, 0) [ 3 12 21 30]
(1, 1) [ 4 13 22 31]
(1, 2) [ 5 14 23 32]
(2, 0) [ 6 15 24 33]
(2, 1) [ 7 16 25 34]
(2, 2) [ 8 17 26 35]
Он использует nditer
, но не имеет каких-либо преимуществ по скорости для вложенной пары циклов for .
In [35]: for x in range(3):
...: for y in range(3):
...: print((x,y), arr[:,x,y])
ndenumerate
использует arr.flat
как итератор, но используя его для
In [38]: for xy, _ in np.ndenumerate(arr[0,:,:]):
...: print(xy, arr[:,xy[0],xy[1]])
делает то же самое, итерации на элементах подматрицы 3x3. Как и в случае ndindex
, он генерирует индексы. Элемент не будет массивом размера 4, который вы хотите, поэтому я проигнорировал это.
Другой подход заключается в сглаживании более поздних осей, транспозиции, а затем просто повторении на (новом) первая ось:
In [43]: list(arr.reshape(4,-1).T)
Out[43]:
[array([ 0, 9, 18, 27]),
array([ 1, 10, 19, 28]),
array([ 2, 11, 20, 29]),
array([ 3, 12, 21, 30]),
array([ 4, 13, 22, 31]),
array([ 5, 14, 23, 32]),
array([ 6, 15, 24, 33]),
array([ 7, 16, 25, 34]),
array([ 8, 17, 26, 35])]
или с печатью по-прежнему:
In [45]: for a in arr.reshape(4,-1).T:print(a)
Почему не просто
[arr[:, x, y] for x in range(3) for y in range(3)]