Я пытаюсь заменить данный шаблон регулярными выражениями на Python, используя re
. Вот кусок кода Python Я написал:Python regex: заменить игнорирование пустой строки
import re
fname = './prec.f90'
f = open(fname)
lines = f.readlines()
f.close()
for i, line in enumerate(lines):
search = re.findall('([\d*]?\.[\d*]?)+?[^dq\_]', line)
if search != []:
print('Real found in line #%d: ' %i)
print search
print('The following line:\n %s' %line)
print('will be replace by:')
newline = re.sub('([\d*]?\.[\d*]?)+?[^dq\_]', r'\g<1>d0\g<2>', line)
print('%s' %newline)
И prec.f90
содержит что-то подобное (это просто пример, это не означает, что все строки, которые я хочу, чтобы заменить иметь вид [x]_[yz] = ...;
):
x_pr = 0.1; y_pr = 0.2; z_pr = 0.1q0
x_sp = 0.1; y_sp = 0.1d0; z_sp = 0.1q0
x_dp = 0.1; y_dp = 0.1d0; z_dp = 0.1q0
x_qp = .1; y_qp = 0.1d0; z_qp = 0.1q0
x_db = 0.; y_db = 0.1d0; y_db = 0.1q0
Моя цель состоит в том, чтобы изменить всю картину, как 0.1
, .1
и 0.
, чтобы получить что-то вроде 0.1d0
; Я не хочу изменять другие шаблоны. Проблема в том, что re.findall('[\d*]?\.[\d*]?)+?([^dq\_]')
соответствует шаблону, который я ищу, но также возвращает пустую строку для других. Поэтому, когда я запускаю этот фрагмент кода, он терпит неудачу, не имея возможности заменить совпадение первой и второй групп в re.sub()
для пустых строк.
Я думаю, что одним из решений было бы игнорировать пустую строку в re.sub
или иметь что-то вроде условного аргумента в ней, но я не мог понять, как это сделать.
Любая помощь будет оценена!
Он не выполняет [подпункт пустой строки], потому что вы сделали все компоненты необязательными с '*'. Какова минимальная строка, которая будет на строке, которую вы хотите заменить? Если это '.x', то измените вторую' \ d * 'на' \ d + ' – beroe
. Проблема в том, что они могут иметь 3 формы, которые я упомянул:' x.y', '.y' и' x.'. Я хочу (и нужно) охватить все эти случаи. – MBR