замена пробельных символов строкой \ t - PullRequest
1 голос
/ 06 февраля 2020

Я пытаюсь заменить символы пробела строкой \ t. Текстовый файл выглядит так:

255 255 255             white
  0   0   0             black
 47  79  79             dark slate gray
 47  79  79             DarkSlateGray
 47  79  79             DarkSlateGrey
105 105 105             dim gray

Мой код выглядит так:

import re
with open('rgb.txt', 'r') as f:
    for line in f:
        print(re.sub(r'\s+', r'\\t', line))

Приведенный выше код дает:

 255\t255\t255\twhite
 \t0\t0\t0\tblack
 \t47\t79\t79\tdark\tslate\tgray
 \t47\t79\t79\tDarkSlateGray
 \t47\t79\t79\tDarkSlateGrey
 105\t105\t105\tdim\tgray

Однако я хотите заменить только пробелы, которые идут после первого числа, до названия цвета. Также не между цветом. Я хочу получить вывод:

 255\t255\t255\twhite
 0\t0\t0\tblack
 47\t79\t79\tdarkslategray
 47\t79\t79\tDarkSlateGray
 47\t79\t79\tDarkSlateGrey
 105\t105\t105\tdimgray

Ответы [ 5 ]

2 голосов
/ 06 февраля 2020

Вы можете сопоставить пробел сразу после di git, что должно решить проблему:

>>> txt = """255 255 255             white
...   0   0   0             black
...  47  79  79             dark slate gray
...  47  79  79             DarkSlateGray
...  47  79  79             DarkSlateGrey
... 105 105 105             dim gray"""
>>> for line in txt.split('\n'):
...     print(re.sub(r'[0-9]\s+', lambda m:m.group(0)[0]+r'\t', line))
...
255\t255\t255\twhite
  0\t0\t0\tblack
 47\t79\t79\tdark slate gray
 47\t79\t79\tDarkSlateGray
 47\t79\t79\tDarkSlateGrey
105\t105\t105\tdim gray

Я не смог найти быстрый способ игнорировать di git в замене, так что я просто сделал лямбду, которая берет di git, который был сопоставлен, и добавляет к нему \t.

1 голос
/ 06 февраля 2020

использование положительный взгляд позади (?<=)

именованные группы захвата (?P<>)

и оператор чередования |.

re.sub("(?P<a>(?<=\d)\s+)|(?P<b>\s+)", lambda m: "\t" if m.lastgroup == "a" else "", line)

вывод:

255\t255\t255\twhite
0\t0\t0\tblack
47\t79\t79\tdarkslategray
47\t79\t79\tDarkSlateGray
47\t79\t79\tDarkSlateGrey
105\t105\t105\tdimgray
1 голос
/ 06 февраля 2020

Я предлагаю использовать вложенные re.sub s:

re.sub(r'^[\d\s]+', lambda x: re.sub(r'\s+', '\t', x.group()), line)

Чтобы избавиться от пробелов при запуске, используйте line.lstrip() перед запуском регулярного выражения:

re.sub(r'^[\d\s]+', lambda x: re.sub(r'\s+', '\t', x.group()), line.lstrip())

Первый ^[\d\s]+ соответствует всем цифрам и пробелам в начале строки, а вторая re.sub заменяет строки пробелов одной вкладкой.

Вывод (для строк без .lstrip()):

255\t255\t255\twhite
\t0\t0\t0\tblack
\t47\t79\t79\tdark slate gray
\t47\t79\t79\tDarkSlateGray
\t47\t79\t79\tDarkSlateGrey
105\t105\t105\tdim gray

Вывод (для строк с .lstrip()):

255\t255\t255\twhite
0\t0\t0\tblack
47\t79\t79\tdark slate gray
47\t79\t79\tDarkSlateGray
47\t79\t79\tDarkSlateGrey
105\t105\t105\tdim gray
0 голосов
/ 06 февраля 2020

Вы можете сделать это в два прохода:

import re
txt = """
255 255 255             white
  0   0   0             black
 47  79  79             dark slate gray
 47  79  79             DarkSlateGray
 47  79  79             DarkSlateGrey
105 105 105             dim gray
"""
for line in txt.split('\n'):
    line = re.sub(r'^\s+', '', line)  # remove leading spaces 
    print(regex.sub(r'(?<![a-zA-Z])(\s+)', r'\\t', line)) # change other spaces by \t when not preceded by a letter

Вывод:

255\t255\t255\twhite
0\t0\t0\tblack
47\t79\t79\tdark slate gray
47\t79\t79\tDarkSlateGray
47\t79\t79\tDarkSlateGrey
105\t105\t105\tdim gray
0 голосов
/ 06 февраля 2020

Я не знаком с python, чтобы быстро ответить точно в python, но вот javascript, показывающий реализацию регулярного выражения. Если первые три параметра всегда будут цепочками цифр, вы можете использовать его таким образом.

var input = `255 255 255             white
  0   0   0             black
 47  79  79             dark slate gray
 47  79  79             DarkSlateGray
 47  79  79             DarkSlateGrey
105 105 105             dim gray`

var output = input.replace(/(\d+)\s+/g, '$1\\t')

console.log(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...