Return list of tuples of date ranges
None of this code should deal in strings, except maybe the final output stage. It can all be thrown away in favour of a single generator function that uses the highly-useful dateutil library. Also type hints will help:
from datetime import date
from typing import Iterable, Tuple
from dateutil.relativedelta import relativedelta


def get_dates(start: date, end: date) -&gt; Iterable[Tuple[date, date]]:

    while True:
        next_start = start + relativedelta(months=1, day=1)
        this_end = next_start - relativedelta(days=1)

        if end &lt;= this_end:
            yield start, end
            break

        yield start, this_end
        start = next_start


def main() -&gt; None:
    start = date.fromisoformat(input('Enter start date: '))
    end = date.fromisoformat(input('Enter end date: '))
    for range_start, range_end in get_dates(start, end):
        print(f'{range_start.isoformat()} - {range_end.isoformat()}')

if __name__ == '__main__':
    main()

Output:
Enter start date: 2020-10-14
Enter end date: 2021-03-26
2020-10-14 - 2020-10-31
2020-11-01 - 2020-11-30
2020-12-01 - 2020-12-31
2021-01-01 - 2021-01-31
2021-02-01 - 2021-02-28
2021-03-01 - 2021-03-26