Обобщить шаблон для регулярного выражения с Python3 - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь извлечь точки данных из текстового файла с примером строки, как показано ниже:

Feb 12 10:49:40 UTC 2020  #  1  #  S0=22.97 S1=28.47 S2=29.12 S3=31.50 S4=32.57 S5=30.03 S6=24.62 S7=28.21 S8=25.41 

(Очень) грязный шаблон, который я придумал, показан ниже:

import re

def parse_data(filename):
pattern = r'.*\s(\d*:\d*:\d*).*S0=(\d*\.\d*)\sS1=(\d*\.\d*)\sS2=(\d*\.\d*)\sS3=(\d*\.\d*)\sS4=(\d*\.\d*)\sS5=(\d*\.\d*)\sS6=(\d*\.\d*)\sS7=(\d*\.\d*)\sS8=(\d*\.\d*).*'
list = []
with open(filename, 'r') as read_file:
    for l in read_file.readlines():
        match = re.match(pattern, l)
    if match:
    s_list = []
    for i in range(2,11):
    s_list.append(match.group(i))
    tuple = (match.group(1), s_list)
    list.append(tuple)
return list
def main():
file1 = 'PythonTest.txt'
list1 = parse_data(file1)
if __name__ == '__main__':
main()

И это работает, однако, если количество интересных точек данных изменяется, я бы не хотел переписывать шаблон специально для этого случая. Например, если у меня есть только S0 и S1, или если у меня есть очки вплоть до S12. Но это не в моей компетенции, можно ли написать более обобщенный шаблон? И если да, то как они будут проиндексированы в группах?

1 Ответ

0 голосов
/ 13 марта 2020

Вы можете использовать этот шаблон в зависимости от ваших потребностей:

import re

txt = """
S0=22.97 S1=28.47 S2=29.12 S3=31.50 S4=32.57 S5=30.03 S6=24.62 S7=28.21 S8=25.41 
"""

pattern = re.compile(r'(S\d+)=(\d+\.\d+)')
for match in pattern.finditer(txt):
    print(match.group(1), '=' ,match.group(2))

>>> S0 = 22.97
>>> S1 = 28.47
>>> S2 = 29.12
>>> S3 = 31.50
>>> S4 = 32.57
>>> S5 = 30.03
>>> S6 = 24.62
>>> S7 = 28.21
>>> S8 = 25.41
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...