Примеры возможного ввода:
'Starts in 09h 52m 56s'
'Ends in 00h 33m 13s'
Выход для каждого из двух вышеперечисленных входов будет:
['Starts', '09', '52', '56']
['Ends', '00', '33', '13']
Прямо внизу - образец такого рода работ:
(Starts|Ends) in ([0-9]{2})h ([0-9]{2})m ([0-9]{2})s
К сожалению, он выводит все так:
[('Ends', '00', '46', '34')]
Вместо:
['Ends', '00', '46', '34']
Что еще более важно, однако, я хотел бы сделать регулярное выражение более кратким, вместо того, чтобы повторять ([0-9]{2})
три раза.
Я попытался использовать (Starts|Ends)|([0-9]{2})[h|m|s]
, но это выводит следующее:
[('Ends', ''), ('', '04'), ('', '20'), ('', '41')]
Опять же, результат, который я ищу, просто:
['Ends', '00', '33', '13']
Как уже было сказано, вот мой код:
regex_time_left = re.compile(r'(Starts|Ends) in ([0-9]{2})h ([0-9]{2})m ([0-9]{2})s')
for product_page in indi_product_urls:
time_left = ff.find_elements(By.CSS_SELECTOR, 'span[id*=deal_expiry_timer_]')
if len(time_left) > 0:
time_left = regex_time_left.findall(time_left[0].text) # [('Ends', '00', '32', '31')]
starts_ends = time_left[0][0]
hours = time_left[0][1]
minutes = time_left[0][2]
seconds = time_left[0][3]
Есть идеи?
Попробуйте этот код!
Вы можете использовать regex
(import re library в python) и извлечь значение часов, минут и секунд. Здесь d {2} представляет целочисленное значение с 2-значным числом, так как часы/минуты/секунды всегда находятся в двухзначном значении.
Код:
import re
start = 'Starts in 09h 52m 56s'
end = 'Ends in 00h 33m 13s'
matchObj = re.match( r'(?:Starts|Ends)[ ]in[ ](\d{2})h[ ](\d{2})m[ ](\d{2})s', start, re.M|re.I)
print ("Start Hours : ", matchObj.group(1))
print ("Start Minutes : ", matchObj.group(2))
print ("Start Seconds : ", matchObj.group(3))
matchObj = re.match( r'(?:Starts|Ends)[ ]in[ ](\d{2})h[ ](\d{2})m[ ](\d{2})s', end, re.M|re.I)
print ("End Hours : ", matchObj.group(1))
print ("End Minutes : ", matchObj.group(2))
print ("End Seconds : ", matchObj.group(3))
Выход :
Start Hours : 09
Start Minutes : 52
Start Seconds : 56
End Hours : 00
End Minutes : 33
End Seconds : 13
Проверить через regex101:
(Starts|Ends)
потому что я буду использовать это, чтобы определить, как отображать информацию и как хранить ее в базе данных
?:
с начала регулярного выражения, и теперь вы можете получить это значение в matchObj.group(1)
, значение часа в matchObj.group(2)
, значение min в matchObj.group(3)
и секунды значение в matchObj.group(4)
. пожалуйста, измените эти изменения, и вы получите желаемый результат успешно.
Я думаю, что вы можете так поступить, но, к сожалению, использование (starts|ends)
не подходит для большей ситуации
import re
a = ['starts in 09h 05m 33s','ends in 00h 33m 12s','Ends in 00h 33m 12s']
print([re.findall("(starts|ends|\d+)",i) for i in a])
Но вы можете попробовать:
print([ [i.split(" ")[0]] + re.findall("\d+",i) for i in a])
Вы можете закрепить соответствующие пары и добавить данные из кортежей
s = 'Start in 09h 52m 56s'
s2 = 'Ends in 00h 33m 13s'
lista = list(zip(s.split(), s2.split()))
s_list = [lista[0][0]]
e_list = [lista[0][1]]
for i in lista[2:5]:
s_list.append(i[0][:2])
e_list.append(i[1][:2])
print(s_list)
print(e_list)
['Start', '09', '52', '56'] ['Ends', '00', '33', '13']
Если вы выполняете сопоставление с числами, я бы добавил их как int
и сделал это, пока вы делаете это
for i in lista[2:5]:
s_list.append(int((i[0][:2])))
e_list.append(int((i[1][:2])))
~/python/stackoverflow/9.22$ python3.7 class.py ['Start', 9, 52, 56] ['Ends', 0, 33, 13]
Вы можете использовать следующие слова для сопоставления слов перед совпадающим шаблоном в течение неопределенного времени:
a=['starts in 09h 05m 33s','ends in 00h 33m 12s']
import re
r1 = re.compile(r'(starts|ends)')
r2 = re.compile(r'(\d{2})[hms]')
for s in a:
m1 = r1.match(s)
if m1:
m2 = r2.findall(s)
print(m1.group(0), m2[0], m2[1], m2[2])