Python сортирует и удаляет дубликаты в списке, используя re.sub

#python #sed #re

#python #sed #python-re

Вопрос:

Я совершенно новичок в Python. Я пытаюсь создать аналоговую команду bash: cat domains.txt |sort -u|sed 's/^*.//g' > domains2.txt файл domains содержит список доменов с префиксом маски и без *. него, например:

 *.example.com
example2.org
  

Около 300 тыс. строк

Я написал этот код:

 infile = "domains.txt"
outfile = "2"
outfile2 = "3"
with open(infile) as fin, open(outfile, "w ") as fout:
    for line in fin:
       line = line.replace('*.', "")
       fout.write(line)
with open('2', 'r') as r, open(outfile2, "w") as fout2 :
    for line in sorted(r):
        print(line, end='',file=fout2)
  

его вырезание *. , как и планировалось, сортирует список, но не удаляет дубликаты строк

Я посоветовал использовать re.sub вместо replace, чтобы сделать шаблон более строгим (как в sed, где я делаю это с начала строк), но когда я попробовал это:

 import re

infile = "domains.txt"
outfile = "2"
outfile2 = "3"
with open(infile) as fin, open(outfile, "w ") as fout:
    for line in fin:
       newline = re.sub('^*.', '', line)
       fout.write(newline)
with open('2', 'r') as r, open(outfile2, "w") as fout2 :
    for line in sorted(r):
        print(line, end='',file=fout2)
  

это просто не работает с ошибками, которые я не понимаю.

Ответ №1:

В регулярных выражениях * . и так же являются специальными символами. Вы должны избегать их, чтобы использовать их.

 import re

s = "*.example.com"
re.sub(r'^*.', '', s)

> 'example.com'
  

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

1. спасибо, я просто не знал, что его работа так же, как в оболочке с

2. теперь его работа, но очень интересная, вырезание и сортировка одного и того же файла через оболочку и через python, дала мне разные результаты. Исходный файл содержит 391033 строки, после сортировки оболочки вырезания я получил 258604 строки, после этого скрипты на python я получил 242825 строк в результате. Завтра попытаюсь найти, в чем разница