Изменение чисел, которые предшествуют строкам с регулярными выражениями - PullRequest
0 голосов
/ 10 октября 2019

У меня есть несколько файлов со многими строками, которые имеют один из двух форматов:

filename 8724.609 13204.0636961952836 8.8970 xjf

ghw5ra_120411x_9999.splits 5516.291992 16028.341273612765160 25.333 reb  -chan 0 -subint 0 -snr 5.6939

В любом случае я хочу изменить числа, которые непосредственно предшествуют трем буквам (в этих случаях "xjf" и"reb") с заданным числом (например, 99,999).

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

x = имя_файла 8724.609 13204.0636961952836 8.8970 xjf

re.sub(r" [a-z]{3}", " abc", x)

Но я не уверен, как изменить числа, предшествующие трем буквам.

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Вы можете использовать

x = re.sub(r'\d+(?:\.\d+)?(?=\s+[a-z]{3}\b)', '99.999', x)

См. Демо регулярных выражений и график регулярных выражений :

enter image description here

Подробности

  • \d+ - 1+ цифр
  • (?:\.\d+)? - необязательная дробная часть: . и 1+ цифры
  • (?=\s+[a-z]{3}\b) - положительный прогноз, требующий 1+ пробелов, три строчные буквы ASCII, за которыми следует граница слова, чтобы сразу появиться справа от текущего местоположения.

Python demo :

import re
x = """filename 8724.609 13204.0636961952836 8.8970 xjf
ghw5ra_120411x_9999.splits 5516.291992 16028.341273612765160 25.333 reb  -chan 0 -subint 0 -snr 5.6939"""
x = re.sub(r'\d+(?:\.\d+)?(?=\s+[a-z]{3}\b)', '99.999', x)
print(x)

Вывод:

filename 8724.609 13204.0636961952836 99.999 xjf
ghw5ra_120411x_9999.splits 5516.291992 16028.341273612765160 99.999 reb  -chan 0 -subint 0 -snr 5.6939
0 голосов
/ 10 октября 2019

Попробуйте следующее:

re.sub('[ ]?\d+(.\d+)? (?=[A-Za-z]{3}[ ]?)', ' 99.99 ', text)

Чтобы разбить его: я ищу пробел с пробелом с помощью этого:

 [ ]?\d+(.)?\d+ 

Затем, используя утверждение предпросмотра, вы ищите 3 символаи может заканчиваться или не заканчиваться пробелом:

(?=[A-Za-z]{3}[ ]?

Наконец, подпрограмма заменит это возвращенное значение на то, что вы указали (99,99) в этом случае.

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