Как добавить символ в начало строки с регулярным выражением? - PullRequest
1 голос
/ 29 января 2020

У меня есть некоторые данные (ниже), которые я пытаюсь выровнять.

| 24 | 11 | 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

Кажется, что когда значение от 3-го до последнего для каждой строки отрицательное, в строке отсутствует символ "|" разделитель. Я пытаюсь использовать регулярное выражение для добавления вертикальной черты посередине записей, чтобы выровнять данные следующим образом:

| 24 | 11 |      | 506 | -1     | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99 | 3|
| 12 | 11 | 1933 | 531 | 2      | 7.78   | N|

Не обращая внимания на пробел, я включил его, чтобы сделать данные более читабельными для цель этого вопроса.

Я знаю, что приведенное ниже выражение найдет правильную текстовую группу и добавит дополнительный «|» после него, но можно ли это изменить, чтобы поставить "|" перед группой?

re.sub(r'(\|*\|*\|\|)', r'\1',DATA)

Просто начинаю с регулярным выражением, поэтому любая помощь приветствуется!

PS - я использую python, чтобы сделать фактические замены / дополнения регулярных выражений для этого сбора данных задача.

Ответы [ 2 ]

1 голос
/ 29 января 2020

Это работает для вас? Это дает мне желаемый результат.

re.sub(r'(\|.*\|.*\|.*)(\|.*\|.*\|\|\n)',r'\g<1>'+'|'+r'\g<2>',DATA)

Я сохранил все до 506 в группе 1 и все после него в группе 2 и добавил '|' между.

1 голос
/ 29 января 2020

В вашем регулярном выражении есть некоторые проблемы. Звездочка * указывает, что предыдущий элемент (будь то один символ или соединение) может повторяться ноль или более раз. Следовательно, \|* будет соответствовать "" (пустая строка), "|", "||" и т. Д. c. и \|*\|*\|\| будет соответствовать двум последовательным барам "||" ему предшествует любое количество баров (0 или более) - следовательно, оно соответствует только двум последним барам.

Чтобы доказать это, с помощью re.sub вы можете заключить обратную ссылку (т.е. \1) с некоторыми другими символами (я использовал фигурные скобки, например {\1} ниже).

data="""| 24 | 11 | 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|
"""
print("using regex above, with curly braces around captured match:")
print(re.sub(r'(\|*\|*\|\|)', r'{\1}', data))

print("desired output:")
print(re.sub(r'(\|[^|]+\|[^|]+\|[^|]+\|\|)', r'|\1', data))

Вывод:

using regex above, with curly braces around captured match:
| 24 | 11 | 506  | -1  | -829.99{||}
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

desired output:
| 24 | 11 || 506  | -1  | -829.99||
| 24 | 11 | 1910 | 506 | 1      | 829.99|3|
| 12 | 11 | 1933 | 531 | 2      | 7.78  |N|

Решение ищет бары с положительным числом элементов в между ними, которые не бары. [^|] означает, что все, кроме | будет соответствовать. Обратите внимание, что в скобках эта полоса не нуждается в экранировании. + обозначает «один или несколько из предыдущего элемента».

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