#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
Просто найдите элементы, которые нужно заменить регулярным выражением, и выполните обычную замену строки. Я думаю, это эффективно, пока у вас всего несколько элементов.