Both renditions of (.*) must be changed to a more specific pattern.
(.*) is greedy, promiscuous and ambiguous. The first one eats the entire remainder of the input. The parser then discovers that after "everything" there's supposed to be more stuff. It then has to back off and retry using "trial matches" to find the % character. With two (.*) patterns, the input string might be reparsed several thousand times to find a match. The first (.*) should likely be ([^%]+) and the second probably ([^\ ]+) here.
Additionally, you can do this all in the Rule (replacing the ^.*$ pattern). There's no need for an additional condition in this case.