Python - Извлечение yyyyMMddhhmmss из файла с помощью Regex - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь получить дату (формат ггггммддччммсс) из строки, используя Regex, но не могу найти образец для использования.

Я пытаюсь с кодом ниже:

import re
string = "date file /20190529050003/folder "
regex = re.compile(r'\b\d{4}\d{2}\d{2}\s\d{2}\d{2}\d{2}\b')
result = regex.findall(string)[0],
print(result)

Но я получаю следующую ошибку:

result = regex.findall(string)[0],
IndexError: list index out of range

Как я могу использовать регулярные выражения для возврата "20190529050003" из строки, которая есть в моем сценарии?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 29 мая 2019

Если наша дата находится сразу после косой черты, мы можем просто использовать это выражение:

.+\/(\d{4})(\d{2})(\d{2}).+

Затем, если необходимо, и мы хотим добавить больше границ, мы, безусловно, можем сделать это, например:

.+\/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2}).+

ДЕМО

или:

^.+\/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\/.+$

ДЕМО

Тест

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r".+\/(\d{4})(\d{2})(\d{2}).+"

test_str = "date file /20190529050003/folder "

subst = "\\1-\\2-\\3"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Если мы хотим получить все числа, мы можем использовать другое выражение:

.+\/(\d+)\/.+

Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r".+\/(\d+)\/.+"

test_str = "date file /20190529050003/folder "

subst = "\\1"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

DEMO

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

1 голос
/ 29 мая 2019

Избавился от \s от выражения.

string = "date file /20190529050003/folder "
regex = re.compile(r'\b\d{4}\d{2}\d{2}\d{2}\d{2}\d{2}\b')
result = regex.findall(string)[0]
'20190529050003'
1 голос
/ 29 мая 2019

Ваш шаблон регулярных выражений отключен, поскольку в целевой отметке времени нет места.Вот один простой способ выполнить поиск:

string = "date file /20190529050003/folder "
matches = re.findall(r'\b\d{14}\b', string)
print(matches)

Это напечатает:

['20190529050003']

Мы могли бы попытаться сделать шаблон более точным и, например, разрешить только допустимые значения для часов, минуты и т. д. поля.Но это будет намного больше работы, и если вы не ожидаете увидеть в своем тексте 14-значные числа, которые являются , а не временными метками, тогда я предлагаю отказаться от создания шаблона более сложным, чем он долженбыть.

0 голосов
/ 29 мая 2019

Я предлагаю разбить строку, которая вызывает ошибку, на две строки:

matches = regex.findall(string)
result = matches[0]

Теперь вы можете ввести matches, чтобы увидеть, что в нем содержится.

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