Вот другой подход с использованием python (проверено на python3 3.5.2
, без жалоб от pylint3 1.5.6
):
""" Locate entire file contents contiguous in other file """
import sys
import re
from mmap import mmap, PROT_READ
def memmap(name):
""" Return memoryview of readonly mmap """
with open(name, 'rb') as file:
return memoryview(mmap(file.fileno(), 0, access=PROT_READ))
def finder(needle, haystack):
""" Return iterator """
return re.compile(re.escape(needle)).finditer(haystack)
print(tuple(finder(*(memmap(name) for name in sys.argv[1:3]))))
Работа с аргументами командной строки через sys.argv
признается упрощенной. Вы можете сделать много других вещей с возвращаемым значением finder
на двух объектах memoryview
, которые вы передаете, кроме передачи его в tuple
. Каждый элемент SRE_Match
, выдаваемый итератором, возвращаемым finder
, имеет множество методов, выборка которых обобщена в выводе print
(в span
, например, указывается диапазон байт каждого совпадения).