Сопоставить слово перед сопоставлением с шаблоном неопределенное время - PullRequest
0 голосов
/ 23 сентября 2018

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

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

Есть идеи?

Ответы [ 4 ]

0 голосов
/ 23 сентября 2018

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

Вы можете использовать regex (import re library in python) и извлечь значение часов, минут и секунд.Здесь d {2} представляет собой целочисленное значение с 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:

enter image description here

0 голосов
/ 23 сентября 2018

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

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 sи сделали это, пока вы делаете это

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 голосов
/ 23 сентября 2018

Я думаю, что вы можете сделать это, но, к сожалению, использование (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 голосов
/ 23 сентября 2018

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

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])
...