Вы можете сделать это:
([0-9]+) (\([^)]+\))? Z
Однако это не будет работать с вложенными парами для Y. Вложенность требует рекурсии, которая не является строго регулярной (но не контекстной). Современные regexp-двигатели все еще могут справиться с этим, хотя и с некоторыми трудностями (обратные ссылки).
На стороне базы данных вы можете сразу получить весь список фильмов со средним рейтингом. Я разделил его на строки для удобства чтения.
SELECT movies.*, AVG(movie_ratings.rating) AS rating
FROM movies
LEFT JOIN movie_ratings ON movies.id = movie_ratings.id
GROUP BY movies.id
ORDER BY rating DESC