Я пишу 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)
ищет оптимальный способ сделать это и код, который будет обрабатывать все шаблоны.
Я думаю, вы можете удалить все ~
внутри полевых квалификаторов с помощью
(?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