Как я могу вставить разделитель два знака после каждого десятичного разделителя в строке текста - PullRequest
0 голосов
/ 18 апреля 2020

Нуб здесь ... Я учу python и пытаюсь нарезать строку текста, чтобы вставить разделитель ','. Я не могу найти каждый десятичный разделитель, чтобы вставить разделитель в двух местах. Я могу сделать это с первым десятичным знаком, но не с остальными. Любая помощь приветствуется.

Я хочу: 4743 i03 / 2064.03,4764 i03 / 2021.30,4745 * i03 / 29111.85,4765 i03 / 2592.50

line = '4743 i03/2064.034764 i03/2021.304745*i03/29111.854765 i03/2592.50'
index = line.find('.')
output_line = line[:index+3] + ',' + line[index+3:]
print( output_line )

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Это можно решить с помощью регулярного выражения:

import re
line = '4743 i03/2064.034764 i03/2021.304745*i03/29111.854765 i03/2592.50'
line = re.sub(r'(\..{2})', r'\1,', line)
print(line)

Вывод:

4743 i03/2064.03,4764 i03/2021.30,4745*i03/29111.85,4765 i03/2592.50,

Однако обратите внимание, что последняя группировка также вернет .50,, поскольку она все равно будет совпадать данные правила в вашем вопросе.

Вы можете прочитать о Регулярном выражении здесь .


Давайте разберем, что происходит внутри re.sub function.

В документации для команды мы видим, что она имеет следующие параметры:

re.sub(pattern, repl, string, count=0, flags=0)

Давайте посмотрим на нашу pattern:

r'(\..{2})'

Во-первых, мы устанавливаем строку в строку raw, добавляя префикс r перед его созданием. Вы можете прочитать об этом здесь . Короткая версия: он говорит нам, что такие символы, как \, должны интерпретироваться как буквальный символ обратного хода sh.

Затем мы создаем capture-group, окружив наш шаблон (). После чего мы escape . с обратным символом sh, потому что в регулярном выражении . совпадает со всеми символами (если вы используете правильные флаги).

Итак, теперь у нас есть это r'(\.)', который совпадает с литералом . в строке. Тем не менее, мы также хотим сопоставить с двумя последними символами впоследствии.

Мы делаем это с помощью ., о котором мы упоминали ранее, сопоставляет все символы, однако мы говорим, чтобы оно совпадало с двумя символами, добавляя суффикс {2} после точки.

Теперь у нас есть полный шаблон: r'(\..{2})'

Теперь мы хотим использовать этот шаблон и заменить его на что-то другое.

Мы сделайте это с шаблоном замены: r'\1,'

\1 здесь обратная ссылка на группу захвата, которую мы создали ранее, и содержит буквальную точку, за которой следуют два символа. После того, как мы перезвоним эту соответствующую строку, мы добавляем , после нее.

Наконец, мы говорим команде re.sub принять line в качестве входной строки для команды.


В Интернете есть много ресурсов, где вы можете выучить регулярные выражения. Если вы хотите поэкспериментировать с описанным выше шаблоном, я создал для вас ссылку здесь , где вы можете лучше повесить его.

0 голосов
/ 18 апреля 2020

Если вы хотите заменить каждый . на ,, попробуйте это:

line = '4743 i03/2064.034764 i03/2021.304745*i03/29111.854765 i03/2592.50'
output_line = line.replace(".", ",")
print(output_line)

Метод .replace с двумя аргументами заменяет каждое вхождение первого аргумента. со вторым (в этом случае он заменяет . на ,).

...