2016-07-13 3 views
3

У меня есть большая строка. Я регулярно должен искать только части этой строки, но мне нужно теперь, где в большой строке найдены биты, найденные в срезах.Могу ли я найти фрагмент строки в Python, но сохранить индекс относительно исходной строки?

Есть ли способ использовать «маску» на строке? То есть

original = 'This is a mock-up large string' 
a_slice = original[10:23] 
a_slice.find('o') 
>>> 1 in a_slice; 11 in original 

Просто повторение поиска не является вариантом, поскольку это слишком дорогостоящий процессор.

Обновление

Приведенный выше пример игрушки использует find. На практике я использую re.finditer().

+0

Почему вы не сохранить первоначальное значение в переменной а затем добавить его к индексу, который вы вычисляете из подстроки? –

+0

У меня есть тысячи кусочков, поэтому это может вызвать накладные расходы, но стоит попробовать @BhargavRao. – Private

+1

Обновление показывает, что вы попали на проблему [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Также см. [Сколько изменений в вопросе слишком много?] (Http://meta.stackoverflow.com/q/290297) –

ответ

1

Как и запрос, если вы хотите использовать finditer (который возвращает итератор объектов Match):

>>> import re 
>>> original = 'This is a mock-up large string' 
>>> p = re.compile('o') 
>>> for match in p.finditer(original, 10, 23): 
... print match.pos 
10 

Просто короткая заметка: функция finditer() (https://docs.python.org/2/library/re.html#re.finditer) не то же самое, как finditer метода() на объекте регулярных выражений (https://docs.python.org/2/library/re.html#re.RegexObject.finditer)

6

str.find принимает аргументы выбора относительно того, где начать/закончить поиск, например:

original = 'This is a mock-up large string' 
o = original.find('o', 10, 23) 
# 11 

Из документов:

находке (...)

S.find(sub [,start [,end]]) -> int 

Return the lowest index in S where substring sub is found, 
such that sub is contained within S[start:end]. Optional 
arguments start and end are interpreted as in slice notation. 
+0

О, это приятно. Я действительно не использую find; знаете ли вы на верху вашей головы, имеет ли находка регулярного выражения то же самое? – Private

+1

да finditer принимает pos и endpos https://docs.python.org/2/library/re.html#re.RegexObject.finditer – sphere

+0

@sphere можете ли вы привести пример в ответ? – Private