Как мне разделить разделение от конкретного персонажа к конкретному персонажу

#python-3.x #regex #sorting #arraylist #split

Вопрос:

У меня есть file.txt с такими URL-адресами, как:

asd.com/abc.xyz?b=21

asd.com/abc.xyz?a=1amp;c=2

asd.com/abc.xyz?a=12amp;d=21

asd.com/abc.xy?b=21

asd.com/abc.xy?a=1amp;c=2

asd.com/abc.xy?a=12amp;d=21

Мне нужен такой результат, как:

asd.com/abc.xyz?a=amp;b=amp;c=amp;d=

asd.com/abc.xy?a=amp;b=amp;c=amp;d=

Как видно, я хочу, чтобы каждый параметр определенного URL-адреса был связан только с одним.

Я написал код для разделения по ? и убрать все после этого ? а затем удалил дубликат, но мой код полностью удаляет a, b, c и d из URL-адресов

 lines_seen = set() # holds lines already seen outfile = open("out.txt", "w") actualout = open("output.txt", "w")  for line in open("txt", "r"):  line = line.split("?", 1)[0]  outfile.write(line "n") outfile.close()  for line in open("out.txt", "r"):  if line not in lines_seen: # not a duplicate  actualout.write(line)  lines_seen.add(line)  actualout.close() 

Комментарии:

1. Когда у вас есть два значения для одного параметра, например "asd.com/abc.xyz?a=1amp;c=2", "asd.com/abc.xyz?a=12amp;d=21" , как вы решаете, какое значение сохранить? Ты хочешь a=1 или a=12 ?

2. Я бы на самом деле заменил все значения на подстановочный знак, чтобы лучше соответствовать, или использовал только первое значение, разные параметры в определенном URL-адресе-это то, что я ищу 🙂

Ответ №1:

  • Разделиться на ?
  • Сгруппируйте по первой части URL-адреса
  • Объедините все вторые части URL-адреса для одной и той же группы

Примечание: Я настоятельно рекомендую вам использовать with контексты для инкапсуляции вызовов open() .

 from itertools import groupby from operator import itemgetter  with open('txt', 'r'), open('output.txt', 'w') as in_file, out_file:  for bareurl,g in groupby((line.split('?') for line in sorted(in_file)), itemgetter(0)):  out_file.write( ''.join([bareurl,  '?',  'amp;'.join(spliturl[1] for spliturl in g),  'n'])  )  # OUTPUT: # asd.com/abc.xy?a=1amp;c=2amp;a=12amp;d=21amp;b=21 # asd.com/abc.xyz?a=1amp;c=2amp;a=12amp;d=21amp;b=21  

Если вы хотите сохранить только последнее значение каждого параметра, чтобы избежать указания более одного значения для каждого параметра в URL-адресе, вы можете создать диктант, сопоставляющий параметры с их значениями:

 from itertools import groupby from operator import itemgetter  with open('txt', 'r'), open('output.txt', 'w') as in_file, out_file:  for bareurl,g in groupby((line.split('?') for line in sorted(in_file)), key=itemgetter(0)):  d = dict(e.split('=') for spliturl in g for e in spliturl[1].split('amp;'))  out_file.write( ''.join([bareurl,  '?',  'amp;'.join(f'{k}={v}' for k,v in d),  'n'])  )  # OUTPUT: # asd.com/abc.xy?a=12amp;c=2amp;d=21amp;b=21 # asd.com/abc.xyz?a=12amp;c=2amp;d=21amp;b=21