Как извлечь последний элемент времени из строки и добавить к нему произвольный текст?

Как можно улучшить сценарий, чтобы после каждого найденного времени добавлялось "(время местное)" в скобках?
  • 18 августа 2024 г. 8:33
Ответы на вопрос 5
Для извлечения последнего элемента времени из строки и добавления к нему произвольного текста можно воспользоваться следующим сценарием на языке Python:

```python
import re

# Исходная строка с временем
string = "Сегодня было занятие. Время окончания - 18:30"

# Извлекаем последнее время из строки
pattern = r'\d{2}:\d{2}'
matches = re.findall(pattern, string)
last_time = matches[-1]

# Добавляем произвольный текст к последнему времени
new_string = string.replace(last_time, last_time + " добавленный текст")  # Пример добавления текста "добавленный текст"

print(new_string)
```

Чтобы улучшить сценарий и добавить "(время местное)" после каждого найденного времени в скобках, можно использовать такой код:

```python
import re

# Исходная строка с временем
string = "Сегодня было занятие. Время окончания - 14:30, начало - 09:00"

# Извлекаем время из строки
pattern = r'\d{2}:\d{2}'
matches = re.findall(pattern, string)

# Добавляем "(время местное)" после каждого найденного времени
new_string = string
for match in matches:
    new_string = new_string.replace(match, match + " (время местное)")

print(new_string)
```

Этот сценарий будет искать все времена в строке и добавлять после каждого времени "(время местное)" в скобках.
const addTimeDescription = (str) =>
    str.replace(/\b\d{1,2}:\d{2}\b(?!.*?\b\d{1,2}:\d{2}\b)/, '$& (время местное)');

// пример использования

const originalString = " с 14:01 к 15:00 работать по плановому";
const updatedString = addTimeDescription(originalString); // ' с 14:01 к 15:00 (время местное) работать по плановому'


здесь берем только то совпадение, после которого нет другого совпадения.

самый интересный момент - ".*?" вместо ".*" , благодаря этому регулярка на порядки быстрее работает на длинных строках с кучей отметок времени

update: более простая регулярка, на основе жадности:
/.*\b\d\d?:\d\d\b/
- .replace(new RegExp(`\\b${ lastTime }\\b`)
+ .replaceAll(new RegExp(`\\b${ lastTime }\\b`, `g`)


Но тут надо понимать, чего вообще вы ожидаете. Например, для строки "плановые подвиги в 12:19, 13:59 и 14:00, ужин в 14:00" обе версии кода вернут "плановые подвиги в 12:19, 13:59 и 14:00, ужин в 20:00 (время местное)" , а вот для "плановые подвиги в 12:19, 13:59 и 14:00, обед в 14:00" ваша версия вернёт "плановые подвиги в 12:19, 13:59 и 14:00 (время местное), обед в 14:00" , а моя - "плановые подвиги в 12:19, 13:59 и 14:00 (время местное), обед в 14:00 (время местное)" .
Может, должно заменяться только в принципе последнее значение времени (т.е. "плановые подвиги в 12:19, 13:59 и 14:00, обед в 14:00 (время местное)" )?
const str = 'с 14:01 к 15:00 работать по плановому';
console.log(str.replace(/(\d\d:\d\d)(?!.*\d\d:\d\d)/, (s) => s + ' (время местное)'));
// с 14:01 к 15:00 (время местное) работать по плановому
...
if (matches) {
const updatedString = originalString.split(lastTime).toSpliced(-1,0,appendText).join(lastTime);
...
Похожие вопросы