Как вырезать часть текста и заменить каждую строку на Python и RegEx

#python #regex

#python #регулярное выражение

Вопрос:

Здравствуйте, я полный новичок в Python и только начал изучать его и использовать RegEx для обработки текста. Заранее прошу прощения, если я нарушил некоторые правила StackOverflow

Я создаю скрипт на Python, где я бы взял (вырезал) дату и время из первой строки и заменил «Date» «TimeWindowStart» и TimeWindowEnd» в каждой строке

 ReportDate=03/24/2019, TimeWindowStart=18:00:00, TimeWindowEnd=20:59:59

Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
  

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

 ([0-9][0-9]|2[0-9])/[0-9][0-9](/[0-9][0-9][0-9][0-9])?
  

И как выбрать время

 ([0-9][0-9]|2[0-9]):[0-9][0-9](:[0-9][0-9])?
  

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

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

 ReportDate=, TimeWindowStart=, TimeWindowEnd=

03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000 
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000 
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000 
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
  

Ответ №1:

во-первых, вы можете указать квантификатор в запросах регулярных выражений, поэтому, если вам нужны 4 числа, которые вам не нужны, [0-9][0-9][0-9][0-9] но вы можете обойтись [0-9]{4} . Чтобы зафиксировать выражение, заключите его в круглые скобки value=([0-9]{4}) , и вы получите только цифры

Если вы хотите использовать re.sub , вам просто нужно придать ему скороговорку, строку замены и вашу строку ввода, например re.sub(pattern, replacement, string)

Поэтому:

 import re

txt = """ReportDate=03/24/2019, TimeWindowStart=18:00:00, TimeWindowEnd=20:59:59

Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
"""

pattern_date = 'ReportDate=([0-9]{2}/[0-9]{2}/[0-9]{4})'
report_date = re.findall(pattern_date, txt)[0]

pattern_time_start = 'TimeWindowStart=([0-9]{2}:[0-9]{2}:[0-9]{2})'
start_time = re.findall(pattern_time_start, txt)[0]

pattern_time_end = 'TimeWindowEnd=([0-9]{2}:[0-9]{2}:[0-9]{2})'
end_time = re.findall(pattern_time_end, txt)[0]

splitted = txt.split('n')  # Split the txt so that we skip the first line

txt2 = 'n'.join(splitted[1:])  # text to perform the sub 

# substitution of your values
txt2 = re.sub('Date', report_date, txt2)
txt2 = re.sub('TimeWindowStart', start_time, txt2)
txt2 = re.sub('TimeWindowEnd', end_time, txt2)

txt_final = splitted[0]   'n'   txt2
print(txt_final)
  

Вывод:

 ReportDate=03/24/2019, TimeWindowStart=18:00:00, TimeWindowEnd=20:59:59

03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
  

Комментарии:

1. Спасибо @dzang, это мне очень помогло!

2. @krcha рад это слышать. удачи с вашей задачей! Если вас устраивает один из приведенных ответов, было бы неплохо пометить его как принятый ответ. приветствия

Ответ №2:

Это частичный ответ, потому что я не особенно хорошо знаю Python API для работы с текстовыми файлами. Вы можете прочитать первую строку файла и извлечь значения для даты отчета и времени начала / окончания окна.

 first = "ReportDate=03/24/2019, TimeWindowStart=18:00:00, TimeWindowEnd=20:59:59"
ReportDate = re.sub(r'ReportDate=([^,] ),.*', '\1', first)
TimeWindowStart = re.sub(r'.*TimeWindowStart=([^,] ),.*', '\1', first)
TimeWindowEnd = re.sub(r'.*TimeWindowEnd=(.*)', '\1', first)
  

Выпишите первую строку со значениями для трех удаленных переменных.

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

 line = "Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000"
line = re.sub(r'bDateb', ReportDate, line)
line = re.sub(r'b TimeWindowStartb', TimeWindowStart, line)
line = re.sub(r' TimeWindowEndb', TimeWindowEnd, line)
  

После обработки каждой строки таким образом, вы можете записать ее в выходной файл.

Ответ №3:

Вот мой код:

 import re

s = """ReportDate=03/24/2019, TimeWindowStart=18:00:00, TimeWindowEnd=20:59:59

Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000"""

datereg = r'(d{2}/d{2}/d{4})'
timereg = r'(d{2}:d{2}:d{2})'

dates = re.findall(datereg, s)
times = re.findall(timereg, s)

# replacing one thing at a time
result = re.sub(r'bDateb', dates[0],
            re.sub(r'bTimeWindowEndb,', times[1]   ',',
                re.sub(r'bTimeWindowStartb,', times[0]   ',',
                    re.sub(timereg, '', 
                        re.sub(datereg, '', s)))))

print(result)
  

Вывод:

 ReportDate=, TimeWindowStart=, TimeWindowEnd=

03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
  

Ответ №4:

Попробуйте это,

 import re

#Open file and read line by line
with open("a") as file:
 # Get and process first line
 first_line = file.readline()
 m = re.search("ReportDate=(?P<ReportDate>[0-9/] ), TimeWindowStart=(?P<TimeWindowStart>[0-9:] ), TimeWindowEnd=(?P<TimeWindowEnd>[0-9:] )",first_line)
 first_line= re.sub(m.group('ReportDate'), "", first_line)
 first_line= re.sub(m.group('TimeWindowStart'), "", first_line)
 first_line= re.sub(m.group('TimeWindowEnd'), "", first_line)
 print(first_line)

 # Process rest of the lines
 for line in file:
    line = re.sub(r'bDateb', m.group('ReportDate'), line)
    line = re.sub(r'bTimeWindowStartb', m.group('TimeWindowStart'), line)
    line = re.sub(r'bTimeWindowEndb', m.group('TimeWindowEnd'), line)
    print(line.rstrip())
  

Вывод:

 ReportDate=, TimeWindowStart=, TimeWindowEnd=

03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
03/24/2019, 18:00:00, 20:59:59, Report-20190323_210000
  

Ответ №5:

Найдите четкое решение, представленное ниже:

 import re

input_str = """
ReportDate=03/24/2019, TimeWindowStart=18:00:00, TimeWindowEnd=20:59:59
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
Date, TimeWindowStart, TimeWindowEnd, Report-20190323_210000
"""

# Divide input string into two parts: header, body
header = input_str.split('n')[1]
body = 'n'.join(input_str.split('n')[2:])

# Find elements to be replaced
ri = re.findall('d{2}/d{2}/d{4}',header)
ri.extend(re.findall('d{2}:d{2}:d{2}',header))

# Replace elements
new_header = header.replace(ri[0],'')
                   .replace(ri[1],'')
                   .replace(ri[2],'')

new_body = body.replace('Date',ri[0])
               .replace('TimeWindowStart',ri[1])
               .replace('TimeWindowEnd',ri[2])

# Construct the result string
full_string = new_header   'nn'   new_body
  

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