Как вырезать часть текста и заменить каждую строку на Python и RegEx - PullRequest
1 голос
/ 27 марта 2019

Здравствуйте, я новичок в 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

Ответы [ 5 ]

1 голос
/ 27 марта 2019

Вот мой код:

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'\bDate\b', dates[0],
            re.sub(r'\bTimeWindowEnd\b,', times[1] + ',',
                re.sub(r'\bTimeWindowStart\b,', 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
1 голос
/ 27 марта 2019

Во-первых, вы можете указать квантификатор в запросах регулярных выражений, поэтому, если вы хотите 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 голос
/ 27 марта 2019

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

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'\bDate\b', m.group('ReportDate'), line)
    line = re.sub(r'\bTimeWindowStart\b', m.group('TimeWindowStart'), line)
    line = re.sub(r'\bTimeWindowEnd\b', 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
1 голос
/ 27 марта 2019

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

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'\bDate\b', ReportDate, line)
line = re.sub(r'\b TimeWindowStart\b', TimeWindowStart, line)
line = re.sub(r'\ TimeWindowEnd\b', TimeWindowEnd, line)

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

0 голосов
/ 27 марта 2019

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

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 + '\n\n' + new_body

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

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