【问题标题】:How do I split split from specific character to specific character如何将拆分从特定字符拆分为特定字符
【发布时间】:2022-01-04 15:26:57
【问题描述】:

我有一个 file.txt,其中包含以下网址:

asd.com/abc.xyz?b=21

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

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

asd.com/abc.xy?b=21

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

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

我需要这样的结果:

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

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

可以看出,我希望特定 url 的每个参数只链接到一个。

我写了一个代码来分隔?并在之后删除所有内容?然后删除了重复项,但我的代码完全从网址中删除了 a、b、c 和 d

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()

【问题讨论】:

  • 当一个参数有两个值时,如"asd.com/abc.xyz?a=1&c=2", "asd.com/abc.xyz?a=12&d=21",你如何决定保留哪个值?你想要a=1 还是a=12
  • 我实际上会用通配符替换所有值以更好地匹配,或者只使用第一个值,特定 url 中的不同参数是我正在寻找的 :)

标签: python-3.x regex sorting arraylist split


【解决方案1】:
  • 拆分?
  • 按网址的第一部分分组
  • 连接同一组的 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,
                                 '?',
                                 '&'.join(spliturl[1] for spliturl in g),
                                 '\n'])
                      )

# OUTPUT:
# asd.com/abc.xy?a=1&c=2&a=12&d=21&b=21
# asd.com/abc.xyz?a=1&c=2&a=12&d=21&b=21

如果您只想保留每个参数的最后一个值,以避免在 url 中为每个参数提供多个值,您可以构建一个 dict 映射参数到它们的值:

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('&'))
        out_file.write( ''.join([bareurl,
                                 '?',
                                 '&'.join(f'{k}={v}' for k,v in d),
                                 '\n'])
                      )

# OUTPUT:
# asd.com/abc.xy?a=12&c=2&d=21&b=21
# asd.com/abc.xyz?a=12&c=2&d=21&b=21

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多