Применение регулярного выражения к подстроке без использования фрагмента строки

#python #regex

#python #регулярное выражение

Вопрос:

Я хочу выполнить поиск соответствия регулярному выражению в строке большего размера начиная с определенной позиции и далее и без использования фрагментов строки.

Моя предыстория в том, что я хочу итеративно выполнять поиск по строке для совпадений с различными регулярными выражениями. Естественным решением в Python было бы отслеживать текущую позицию в строке и использовать, например

 re.match(regex, largeString[pos:])
  

в цикле. Но для действительно больших строк (~ 1 МБ) нарезка строк, как в largeString[pos:] , становится дорогостоящей. Я ищу способ обойти это.

Примечание: Забавно, что в нише документации по Python говорится о необязательном pos параметре функции match (который был бы именно тем, что я хочу), которого нет в самих функциях :-).

Ответ №1:

Варианты с параметрами pos и endpos существуют только как члены объектов регулярного выражения. Попробуйте это:

 import re
pattern = re.compile("match here")
input = "don't match here, but do match here"
start = input.find(",")
print pattern.search(input, start).span()
  

… выводит (25, 35)

Комментарии:

1. Это безумие! pos Параметр действительно есть, но только с объектными методами! Должно быть, я был слеп… Большое спасибо, также другим ребятам.

Ответ №2:

pos Ключевое слово доступно только в версиях метода. Например,

 re.match("e ", "eee3", pos=1)
  

недопустимо, но

 pattern = re.compile("e ")
pattern.match("eee3", pos=1)
  

работает.

Комментарии:

1. … и я был так уверен, что единственной разницей между функцией модуля и методом объекта был параметр regex (и, возможно, флаги) :-/ . Обвиняйте меня.

Ответ №3:

 >>> import re
>>> m=re.compile ("(o )")
>>> m.match("oooo").span()
(0, 4)
>>> m.match("oooo",2).span()
(2, 4)
  

Ответ №4:

Вы также могли бы использовать положительные ссылки, например:

 import re

test_string = "abcabdabe"

position=3
a = re.search("(?<=.{"   str(position)   "})ab[a-z]",test_string)

print a.group(0)
  

дает:

 abd
  

Комментарии:

1. Спасибо за идею, но для длинных входных строк, если я буду искать ближе к концу этой строки, это заставило бы очень долго искать :). Но я оставлю это на потом.