ST. LOUIS -- Brendan Ryan was at a loss for words.

The Cardinals were packing up in the clubhouse to go home after CC Sabathia threw a complete-game three-hitter at Busch Stadium to blank them, 3-0. Having lost three games in a row to a division contender, Ryan did not have much to say about Sabathia's performance.

"He's filthy," Ryan mumbled simply.

It was just Sabathia's fourth start since he was traded to the Brewers, and it is beginning to look as if Brewers general manager Doug Melvin pulled off the trade of the year. Against the Cardinals on Wednesday night, Sabathia pitched his third straight complete game.

It was as if Sabathia was an unmerciful freight train and the Cardinals deliriously stood in his path.

"We had a plan, but when a guy makes pitches like that, I don't care what your plan is," manager Tony La Russa said. "When a guy is making pitches on both sides of the black and he's changing speeds and he's got 90-something, 80-something -- like I say, nobody's pitched better against us this year than that."

Over the first 5 2/3 innings, Sabathia was literally untouchable. It was not until two outs in the sixth inning when Ryan stroked the Cardinals' first base hit past Prince Fielder. Ryan Ludwick followed with a single of his own to bring up Albert Pujols.

Down 2-0, it was the Cardinals' best chance.

But Sabathia never lost his cool on a night the Cardinals desperately needed a win. Sabathia worked Pujols to a 1-2 count, then blasted a 98-mph fastball that Pujols weakly tapped to right field for out No. 3.

"Anytime you've got runners on with Albert coming up, you feel good about the possibility of something happening," Ryan said. "Like I said, [Sabathia] got strike one, and he's as tough as he gets."

While the Cardinals sat in the dugout scratching their heads and conjuring up any possible remedy to fight Sabathia, Braden Looper fought to keep the Brewers close.

Looper lasted only five innings, because his pitch count rose exponentially in the third and fifth innings, but he only gave up seven hits and one earned run. J.J. Hardy took a pitch Looper left up over the heart of the plate in the fifth and drove it over the left-center-field wall to give the Brewers a 1-0 lead.

As it turned out, that was all Milwaukee needed.

"They kept fouling off a lot of really good pitches," Looper said. "For the most part, I made all of my pitches. I made the mistake to J.J. Hardy and it cost me a run -- cost me the game, basically."

Entering the game for Looper, Kelvin Jimenez threw two innings in relief and gave up a sacrifice fly that scored Mike Cameron. Jason Isringhausen allowed a solo home run to Ryan Braun in the ninth to cap the Brewers scoring.

On any other night, a three-run deficit is not much to ask to overcome.

But in facing the reigning American League Cy Young winner on his "A" game, the Cardinals were faced with an extraordinary task.

"To put together nine innings like that, you've got to give the guy a lot of credit," Ryan said.

Having lost three straight games to the Brewers, the Cardinals are still stuck in third place and are two games behind Milwaukee.

Wednesday night's shutout was only the second time the Cardinals were blanked all year. The other was against the San Francisco Giants on April 19. Scoring six runs over the past three games, the Cardinals need to find some offense quickly if they want to avoid a sweep at home.

"Hopefully tomorrow, we'll put a couple of hits together and everybody gets contagious," Ryan said. "But we need this one tomorrow."