#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. Спасибо за идею, но для длинных входных строк, если я буду искать ближе к концу этой строки, это заставило бы очень долго искать :). Но я оставлю это на потом.