Замена значений, которые не прошли проверку соответствия, с использованием библиотеки регулярных выражений Python - PullRequest
0 голосов
/ 11 января 2019

У меня очень большая строка, состоящая из ряда чисел, разделенных одним или несколькими пробелами. Некоторые из чисел равны -123, а остальные могут быть любыми случайными числами.

example_string = "102.3  42.89  98  812.7  374  5  -123  8  -123  13  -123  21..."

Я хотел бы заменить значения, которые не равны -123, на 456 наиболее эффективным способом.

updated_example_string = "456  456  456  456  456  456  -123  456  -123  456  -123  456..."

Я знаю, что в библиотеке регулярных выражений python есть метод sub, который достаточно эффективно заменит совпадающие значения. Есть ли способ заменить значения, которые НЕ совпадают? Как я уже говорил, это довольно большая строка из исходного файла размером около 100 МБ. Предполагая, что есть способ использовать re.sub для выполнения этой задачи, является ли это даже правильным / наиболее эффективным способом решения такой проблемы?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Вы можете сопоставить только числа между границами пробелов и использовать re.sub с функцией обратного вызова, чтобы проверить, не совпадает ли -123. Если это не так, соотнесите его с 456

(?<!\S)-?\d+(?:\.\d+)?(?!\S)

Объяснение

  • (?<!\S) Отрицательный взгляд за тем, чтобы утверждать, что слева не является непробельным символом
  • -? Необязательно -
  • \d+(?:\.\d+)? Совпадение цифр 1+ с необязательной деталью, которая соответствует цифрам . и 1+
  • (?!\S) Отрицательный взгляд на то, что справа, не является символом без пробелов
* +1025 * Пример
import re
pattern = r"(?<!\S)-?\d+(?:\.\d+)?(?!\S)"
s = "102.3  42.89  98  812.7  374  5  -123  8  -123  13  -123  21"

print(re.sub(pattern, lambda m: "456" if m.group() != "-123" else m.group(), s))

Результат

456  456  456  456  456  456  -123  456  -123  456  -123  456

См. Демоверсию Regex | Python demo

0 голосов
/ 11 января 2019

Вы можете использовать это регулярное выражение:

(^|\s)(?!-123(\s|$))-?[0-9.]+(?=\s|$)

Он ищет начало строки или пробел, за которым не следуют -123 и пробел конца строки (с использованием отрицательного взгляда), затем некоторое количество цифр или ., за которым следует пробел или конец строка.

Затем вы можете заменить на \g<1>456, чтобы превратить все эти числа в 456. \g<1> в замене сохраняет любое пространство, захваченное первой группой.

Демонстрация по regex101

В Python:

import re
string = "102.3  42.89 -1234 98  -812.7  374  5  -123  8  -123  13  -123  21 -123"
print re.sub(r'(^|\s)(?!-123(\s|$))-?[0-9.]+(?=\s|$)', '\g<1>456', string)

выход

456  456 456 456  456  456  456  -123  456  -123  456  -123  456 -123

Демонстрация на rextester

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