regx для питона

1

Я пишу regx для удаления тестового квалификатора и дополнительного разделителя из строки.

У меня есть несколько шаблонов, как показано ниже,

"ID"~"Name"~"DESC"
1~2014~13~"DS"~DF"
1~2014~13~"DS"~"DF" 
"1ABCA~B C"~"ERTE"
"2"~"XYZ"~"ABC~ is~ bother"
"3"~"YYZ"~"MEL O CRÈME DOUGHNUTS RECLASS"
4~"XAA"~"sf~sd sdfsf"
5~"TES"~"SFSFSF"sdfsf"
6~"ABC"SDDSL~"dfadf"

ожидаемый результат,

ID~Name~DESC
1~2014~13~DS~DF
1~2014~13~DS~DF
1ABCA B C~ERTE
2~XYZ~ABC  is  bother
3~YYZ~MEL O CRÈME DOUGHNUTS RECLASS
4~XAA~sf sd sdfsf
5~TES~SFSFSF"sdfsf
6~ABCSDDSL~dfadf

Я написал ниже код для того же самого,

import re

delimiter = '~'
pattern = re.compile(r'"' + delimiter + r'"')
pattern1 = re.compile(r'"[^"]*(?:""[^"]*)*"')

with open("source file path here ", "r") as \
        test:
    for line in test:
        fields = re.split(pattern, line)
        print(fields)
        output = ""
        if re.match('^[^"]', line):
            matches = re.findall(pattern1, line)
            print(matches)
            for match in matches:
                line = re.sub(match, re.sub('^["]|["]$', "", match), line)
            print(line)
        else:
            lastfield = fields[-1]
            for field in fields:
                if field != lastfield:
                    field = re.sub('^["]|["]$', "", field)
                    output = output + re.sub('[' + delimiter + ']', " ", field) \
                        + delimiter
                else:
                    field = re.sub('^["]|["]$', "", field)
                    output = output + re.sub('[' + delimiter + ']', " ", field)
        print(output)

ищет оптимальный способ сделать это и код, который будет обрабатывать все шаблоны.

Теги:
python-3.7

1 ответ

1
Лучший ответ

Я думаю, вы можете удалить все ~ внутри полевых квалификаторов с помощью

(?m)(?:(?<=^)|(?<=~))"(.*?)"(?=$|~)

подробности

  • (?m) - re.M режим, чтобы сделать ^ старта матча линии и $, чтобы соответствовать концу строки (удалить, если строки обрабатываются построчно)
  • (?:(?<=^)|(?<=~)) - начало строки или позиция, которой предшествует ~
  • " - двойная кавычка
  • (.*?) - Группа 1: любые символы 0+, отличные от новой строки, как можно меньше
  • " - двойная кавычка
  • (?=$|~) - конец строки или местоположение, за которым следует ~.

а затем удалите все ненужные двойные кавычки с

(?m)(?:(?<=^)|(?<=~))"|"(?=$|~)|"(?=[^\n"~]+(?:~|$))

подробности

  • (?m) - модификатор re.M (удалите, если строки обрабатываются по строкам)
  • (?:(?<=^)|(?<=~))" - двойная кавычка в начале строки или справа после ~
  • "(?=$|~)| - a " в конце строки или до ~
  • "(?=[^\n"~]+(?:~|$)) - это " следуют с другими, чем LF (удалить, если строки обрабатываются построчно) 1 или более символов, " и ~, а затем ~ или конец строки.

Тонкости можно использовать для .replace('~', ' ') подстрок, а затем удалить все ~ с помощью пробелов с использованием .replace('~', ' ') внутри метода обратного вызова replace.

См. Демонстрацию Python:

import re
rx_0 = r"""(?m)(?:(?<=^)|(?<=~))"(.*?)"(?=$|~)"""
rx = r"""(?m)(?:(?<=^)|(?<=~))"|"(?=$|~)|"(?=[^\n"~]+(?:~|$))"""
s = ("\"ID\"~\"Name\"~\"DESC\"\n"
    "1~2014~13~\"DS\"~DF\"\n"
    "1~2014~13~\"DS\"~\"DF\"\n"
    "\"1ABCA~B C\"~\"ERTE\"\n"
    "\"2\"~\"XYZ\"~\"ABC~ is~ bother\"\n"
    "\"3\"~\"YYZ\"~\"MEL O CRÈME DOUGHNUTS RECLASS\"\n"
    "4~\"XAA\"~\"sf~sd sdfsf\"\n"
    "5~\"TES\"~\"SFSFSF\"sdfsf\"\n"
    "6~\"ABC\"SDDSL~\"dfadf\"")

print( re.sub(rx, "", re.sub(rx_0, lambda x: x.group(1).replace('~', ' '), s)))

Выход:

ID~Name~DESC
1~2014~13~DS~DF
1~2014~13~DS~DF
1ABCA B C~ERTE
2~XYZ~ABC  is  bother
3~YYZ~MEL O CRÈME DOUGHNUTS RECLASS
4~XAA~sf sd sdfsf
5~TES~SFSFSFsdfsf
6~ABC"SDDSL dfadf
  • 1
    Спасибо, что работает нормально

Ещё вопросы

Сообщество Overcoder
Наверх
Меню