Сопоставлять слова перед сопоставлением с шаблоном неопределенное время

1

Примеры возможного ввода:

'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]

Есть идеи?

  • 1
    В чем проблема с вашим текущим решением? Вы можете просто получить доступ к кортежу в элементе 0 и преобразовать его в список, если вам нужен нужный формат. Можете ли вы показать случай, когда он не делает то, что вам нужно?
  • 0
    @pdowling Я только что отредактировал мой вопрос. Это не конец света, как я это сделал, но я хотел бы сделать что-то более лаконичное и получить доступ к выводу более простым способом.
Показать ещё 7 комментариев
Теги:
python-3.x
regex-group

4 ответа

1

Попробуйте этот код!

Вы можете использовать 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:

Изображение 174551

  • 0
    мне нужно захватить (Starts|Ends) потому что я буду использовать это, чтобы определить, как отображать информацию и как хранить ее в базе данных
  • 0
    @ Энтони ладно. поэтому вам нужно удалить ?: с начала регулярного выражения, и теперь вы можете получить это значение в matchObj.group(1) , значение часа в matchObj.group(2) , значение min в matchObj.group(3) и секунды значение в matchObj.group(4) . пожалуйста, измените эти изменения, и вы получите желаемый результат успешно.
Показать ещё 2 комментария
0

Я думаю, что вы можете так поступить, но, к сожалению, использование (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])
0

Вы можете закрепить соответствующие пары и добавить данные из кортежей

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]
0

Вы можете использовать следующие слова для сопоставления слов перед совпадающим шаблоном в течение неопределенного времени:

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])
  • 0
    как только я заболею, попробуй это!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню