У меня есть текстовый файл с несколькими строками. Как я могу извлечь часть из каждой строки, используя регулярное выражение в python? - PullRequest
0 голосов
/ 18 марта 2020

Линейный вход выглядит следующим образом:

-rw-r--r-- 1 jttoivon hyad-all   25399 Nov  2 21:25 exception_hierarchy.pdf

Требуемый вывод:

25399 Nov  2 21:25 exception_hierarchy.pdf

, что size, month, day, hour, minute и filename соответственно.

Вопрос просит вернуть список кортежей (size, month, day, hour, minute, filename), используя для этого регулярные выражения (либо match, search, findall, либо finditer method).

Мой код, который я пробовал -

for line in range(1):
    line=f.readline()
x=re.findall(r'[^-]\d+\w+:\w+.*\w+_*',line)
    print (x)

My output - [' 21:25 add_colab_link.py']

Ответы [ 2 ]

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

Вот рабочий пример использования регулярных выражений благодаря пакету re:

>>> import re
>>> line = "-rw-r--r-- 1 jttoivon hyad-all   25399 Nov  2 21:25 exception_hierarchy.pdf"
>>> pattern = r"([\d]+)\s+([A-z]+)\s+(\d{1,2})\s+(\d{1,2}):(\d{1,2})\s+(.+)$"
>>> output_tuple = re.findall(pattern, line)[0]
>>> print(output_tuple)
('25399', 'Nov', '2', '21', '25', 'exception_hierarchy.pdf')
>>> size, month, day, hour, minute, filename = output_tuple

Большая часть logi c кодируется в необработанной переменной pattern. Это очень легко, хотя, если вы посмотрите на это по частям. Смотрите ниже, с новыми строками, которые помогут вам прочитать:

([\d]+)    # means basically group of digits (size)
\s+        # means one or more spaces
([A-z]+)   # means one or more letter (month)
\s+        # means one or more spaces
(\d{1,2})  # one or two digits (day)
\s+        # means one or more spaces
(\d{1,2})  # one or two digits (hour)
:          # looking for a ':'
(\d{1,2})  # one or two digits (minute)
\s+        # means one or more spaces
(.+)       # anything basically
$          # until the string ends

Кстати, вот рабочий пример, не использующий re (потому что это на самом деле здесь не обязательно):

>>> line = "-rw-r--r-- 1 jttoivon hyad-all   25399 Nov  2 21:25 exception_hierarchy.pdf"
>>> size, month, day, hour_minute, filename = line.split("hyad-all")[1].strip().split()
>>> hour, minute = hour_minute.split(":")
>>> print(size, month, day, hour, minute, filename)
25399 Nov 2 21 25 exception_hierarchy.pdf
0 голосов
/ 18 марта 2020

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

Я отвечаю на ваш вопрос, потому что не долго go I сделал те же ошибки, и я был рад, если кто-то все еще ответил.

import re  # import of regular expression library

# I just assume you had three of those pieces in one list:
my_list = ["-rw-r--r-- 1 jttoivon hyad-all 12345 Nov 2 21:25 exception_hierarchy.pdf", "-rw-r--r-- 1 jttoivon hyad-all 25399 Nov 2 21:25 exception_hierarchy.pdf", "-rw-r--r-- 1 jttoivon hyad-all 98765 Nov 2 21:25 exception_hierarchy.pdf"]

# I create a new list to store the results in
new_list = []

# I produce this loop to go through every piece in the list:
for x in my_list:
    y = re.findall("([0-9]{5}.+pdf)", x) # you can check the meaning of the symbols with a simple google search
    for thing in y:
        a, b, c, d, e = thing.split(" ")
        g, h = d.split(":")
        z = (a, b, c, g, h, e)
        new_list.append(z)

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