The accident happened in Granges-près-Marnand at 6.45pm, according to canton of Vaud police.
An AFP reporter who arrived at the scene saw the wreckage of the train near the small station on the edge of the village of some 1,200 people.
The force of the impact was clear from the mangled engines of the trains,which were wrapped together.
One train had been bound for Lausanne, some 38 kilometres to the south, while the other was travelling north from the same city, officials said.
A total of 46 passengers had been on board, all of them Swiss, police said.
Frantic efforts continued into early Tuesday to free one of the drivers, with whom there had been no contact since the crash.
But by 1.30am they had managed to extract his body from the cab of his train, using special equipment to cut through the wreckage.
Rescue teams deployed a heavy-lifting crane to remove the rest of the wreckage and clear the line, working under arc-lights set up to enable the operations to continue through the night.
Monday's collision on what is one of the most popular and safest rail networks in Europe was the latest in a series of rail accidents on the continent.
It comes in the wake of Wednesday's tragedy in the Spanish city of Santiago de Compostela which killed 79; and a crash near Paris two weeks ago that claimed seven lives.
Rescue workers, including medics and firefighters, had rushed to the scene from across the Broye region which includes Granges-pres-Marnand, as well as from neighbouring cities.
A helicopter and ambulances rushed the five seriously injured to a hospital in the nearby town of Payerne and south Lausanne.
Their injuries were not life-threatening, police said.
In total, 26 people were taken to five separate hospitals, while those with lower-level injuries were treated on site by the emergency services and volunteer medics.
Traffic was interrupted between the towns of Moudon and Payerne, the Swiss railway operator SBB said.
Spokesman Reto Schärli said the stretch would probably not reopen until Tuesday afternoon. A bus service has been laid on.
SBB said both trains were operated by its regional service.
Police experts, along with members of the Swiss accident investigation authority, were on site to launch a probe into the causes of the crash, officials said.
An SBB spokeswoman told AFP that the two trains should have crossed at the station, thanks to a track system that allows them to pass one another.
Some media reports said the collision could have been sparked by one of the trains setting off too soon.
The accident echoed one in January at Neuhausen-am-Rheinfall in northern Switzerland, where two regional trains collided near a station.
Twenty-five people were slightly injured in that crash, caused by a failure to respect a signal.
Monday's crash was Switzerland's most serious since one in Zurich in 2003 which injured 45 people.