Regex: получение текста между метками времени - PullRequest
1 голос
/ 06 марта 2020

Есть ли способ получить образец текста между двумя временными метками на изображении ниже?

string=[3/24/17, 8:34:00 PM] Hello [3/24/17, 8:35:22 PM] THIS TEXT [3/24/17, 8:39:07 PM] Bye [3/24/17, 8:39:19 PM]

Использование Regex = (\[.*?\](.*?)\[.*?\])

Я могу получить только Hello и Bye

Что можно сделать, чтобы получить текст между второй и третьей метками времени.

Ответы [ 5 ]

1 голос
/ 06 марта 2020

В зависимости от того, насколько строго вы хотите, чтобы совпадение было, это немного ограничивающее.

>>> regex = r"""
...         \d+:\d+:\d+\s[AP]M\]    # Match end time text.
...         \s*(.*?)\s*             # Group text between time and date, excluding spaces on each end.
...         \[\d+/\d+/\d+           # Match begin date text.
...         """
>>> 
>>> re.findall(regex, string, flags=re.VERBOSE)
['Hello', 'THIS TEXT', 'Bye']
0 голосов
/ 06 марта 2020

Проблема в вашем регулярном выражении: python поиск в линейном порядке

[date]first[date2]second[date3]third[date4]

здесь, когда найдено first, тогда даты1 и дата2 обрабатываются, поэтому обработка начинается с second, следовательно, python выиграно не могу найти second. Как это не вписывается в [date]text[date].

ИМХО, вы можете попробовать одну из двух вещей

  1. (.*?\](.*?)\[.*?) искать вещи между квадратными скобками
  2. (\[.*?\](.*?)) искать строку пост даты.
0 голосов
/ 06 марта 2020

Один из подходов заключается в использовании re.split с шаблоном регулярных выражений \s*\[.*?\]\s* для разделения ввода по временным меткам, оставляя после себя текст, который вы хотите сопоставить, как отдельные записи в списке. Я также отфильтровываю пустые строковые элементы, чтобы иметь дело с крайними случаями, когда строка может начинаться или заканчиваться временной меткой (что приведет к совпадению пустой строки слева / справа).

string = "[3/24/17, 8:34:00 PM] Hello [3/24/17, 8:35:22 PM] THIS TEXT [3/24/17, 8:39:07 PM] Bye [3/24/17, 8:39:19 PM]"
parts = re.split(r'\s*\[.*?\]\s*', string)
parts = filter(None, parts)
print(parts)

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

['Hello', 'THIS TEXT', 'Bye']
0 голосов
/ 06 марта 2020

Вы можете использовать re.findall с ленивым квантификатором (?) Для сопоставления между] и [:

s = "[3/24/17, 8:34:00 PM] Hello [3/24/17, 8:35:22 PM] THIS TEXT [3/24/17, 8:39:07 PM] Bye [3/24/17, 8:39:19 PM]"
m = re.findall('\]\s(.*?)\s\[', s)
print(m)

Вывод:

['Hello', 'THIS TEXT', 'Bye']
0 голосов
/ 06 марта 2020

Вы можете сопоставить буквы с [AZ]:

string = '[3/24/17, 8:34:00 PM] Hello [3/24/17, 8:35:22 PM] THIS TEXT [3/24/17, 8:39:07 PM] Bye [3/24/17, 8:39:19 PM]'
print(re.findall(' ([a-z A-Z]+) ', string))
# ['Hello', 'THIS TEXT', 'Bye']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...