def METHOD_NAME(stream: str, index: int) -> parsy.Result:
    # read from index until -> end_of_unquoted_str
    # all characters in between have to be allowed characters
    # there has to be at least one non-digit character (to not read numbers as strings)
    start = index
    found_no_number = False
    valid_string_chars = True
    number_found_dot = False
    # valid numbers are: digits or a minus at the start: 123, -321, -123.321
    def is_no_number() -> bool:
        nonlocal number_found_dot
        char = stream[index]
        is_dot = char == "."
        is_num = str.isdigit(char) or (start == index and char == "-") or (is_dot and not number_found_dot)
        if not number_found_dot and is_dot:
            number_found_dot = True
        return not is_num
    # look ahead to next delimiter
    while index < len(stream) and valid_string_chars and not unquoted_end_of_unquoted_str.match(stream[index]):
        found_no_number = is_no_number() if not found_no_number else found_no_number
        valid_string_chars = unquoted_allowed_characters.match(stream[index]) is not None
        index += 1
    result = stream[start:index]
    for stop in stop_words:
        stop_len = len(stop)
        # make sure the result is not a stop word. e.g. foo should match foo, foo-123 but not foobar
        if result.startswith(stop) and (len(result) == stop_len or not str.isalpha(result[stop_len])):
            return parsy.Result.failure(index, "A-Za-z0-9_-:")
    if index <= len(stream) and valid_string_chars and found_no_number:
        return parsy.Result.success(index, result)
    else:
        return parsy.Result.failure(index, "A-Za-z0-9_-:")