Como eles parecem ser essencialmente estruturados como consultas de URL, talvez você queira examinar um analisador de consulta dedicado, como o do módulo urlparse
do python. Por exemplo
#!/usr/bin/python2
import sys,re
from urlparse import urlparse,parse_qs
keys = ['city', 'language', 'x', 'y', 'z']
with open(sys.argv[1],'r') as f:
for line in f:
u = urlparse(line.strip('\n'))
q = parse_qs(u.query)
# extract the strings we want from the dict-of-lists
values = ','.join(['-'.join(q[key]) for key in keys])
# extract the timestamp portion of the path (between '[' and ']')
m = re.search('(?<=\[).*?(?=\])', u.path)
ts = m.group(0)
# print as a comma-separated list
print '{},{}'.format(ts, values)
Então
$ ./queryparse.py queries.txt
31/May/2016:11:58:29-0500,london,en,12345,6789,1
31/May/2016:11:59:15-0500,madrid,en,4589.4583,4865.5465,3
31/May/2016:12:05:13-0500,london,en,12345,6789,1
31/May/2016:12:15:13-0500,london,en,12345,6789,1
31/May/2016:12:26:53-0500,newyork,en,45724.75575,424424.77474,3
NOTA: o método parse_qs
retorna um dict de listas, isto é, permite múltiplos valores para cada chave de consulta: o '-'.join(q[key])
vira notionalmente cada lista de valores em uma string separada por hífen, no entanto, neste caso, esperamos apenas um valor único para cada chave.