<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def read_internal_strain_tensor(self):
 """ Reads the internal strain tensor and populates self.internal_strain_tensor with an array of voigt notation tensors for each site. """

        search = []

        def internal_strain_start(results, match):
            results.internal_strain_ion = int(match.group(1)) - 1
            results.internal_strain_tensor.append(np.zeros((3, 6)))

        search.append([r"INTERNAL STRAIN TENSOR FOR ION\s+(\d+)\s+for displacements in x,y,z  \(eV/Angst\):",
                       None, internal_strain_start])

        def internal_strain_data(results, match):
            if match.group(1).lower() == "x":
                index = 0
            elif match.group(1).lower() == "y":
                index = 1
            elif match.group(1).lower() == "z":
                index = 2
            else:
                raise Exception(
                    "Couldn't parse row index from symbol for internal strain tensor: {}".format(match.group(1)))
            results.internal_strain_tensor[results.internal_strain_ion][index] = np.array([float(match.group(i))
                                                                                           for i in range(2, 8)])
            if index == 2:
                results.internal_strain_ion = None

        search.append([r"^\s+([x,y,z])\s+" + r"([-]?\d+\.\d+)\s+" * 6, lambda results,
                                                                              line: results.internal_strain_ion is not None,
                       internal_strain_data])

        self.internal_strain_ion = None
        self.internal_strain_tensor = []
        micro_pyawk(self.filename, search, self)