LINUX.ORG.RU

Регексп казалось бы типовая задача, ан-нет

 ,


0

0

Need match:

aaa.bbb
aaa.bbb.ccc
aaa.bbb.ccc.ddd

Но не:

.aaa
aaa.
.aaa.
aaa.bbb.
aaa.bbb.ccc.
aaa..bbb...ccc

Т.е тупо заматчить строку, у которой внутри есть одна или более точек(но не две подряд) и которая не заканчивается точкой. Уже всё перегуглил. Казалось бы типовая задача, а решения ее на поверхности нет. То. что удалось нагуглить:

r'(\w+\.*\w+\.*\w+)'
'([\.*\w+]*)
★★★

ТС показывает мастеркласс того, как джунам лошпидронить местных гуру.

Достаточно правильно сформулировать вопрос, чтобы задеть самолюбие, и тут же набегут решать.

wandrien ★★
()

А почему вообще кто-то пользуется regexp?

Тут же обычный один проход по строке. regexp может быть лишь медленнее и более непонятен…

Если текущий элемент точка то проверяем что слева и справа есть элементы и они не точки.

fsb4000 ★★★★★
()
Ответ на: комментарий от eternal_sorrow
text = """
aaa.bbb.ccc.ddd = {
    some = some;
    some1 = some1;
}
aaa1..bbb.ccc.ddd = {
    some = some;
    some1 = some1;
}
aaa2.bbb = {
    some = some;
    some1 = some1;
}

.aaa3.bbb.ccc = {
    some = some;
    some1 = some1;
}


"""

import re
from collections import defaultdict
from ast import literal_eval

items = defaultdict(dict)
for name, lines in re.findall(r'[^.]+(\.[^.]+ = {\s*(.*?)\s*}', text, flags=re.S):
    for var, val in re.findall(r'\s*(\w+)\s*=\s*(.*?);?$', lines, flags=re.M):
        # items[name][var] = literal_eval(val)
        items[name][var] = val
  
print('\n')

for k,v in items.items():
    print(k, v)
serg002 ★★★
() автор топика
Последнее исправление: serg002 (всего исправлений: 2)
Ответ на: комментарий от serg002
  1. Задача была поставлена «заматчить строку, у которой внутри есть одна или более точек(но не две подряд) и которая не заканчивается точкой». А не писать парсер конфиг-файлов.
  2. Про https://en.wikipedia.org/wiki/Category:Parser_generators в ваших краях не слышали?
wandrien ★★
()
Ответ на: комментарий от wandrien

А не писать парсер конфиг-файлов.

's/А не писать парсер конфиг-файлов./А не писать парсер конфиг-файлов из говна и палок./'

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от mydibyje

Какое условие, такой и ответ на самом деле.

Если бы ТС мог корректно сформулировать условие задачи, то и ответ был бы корректным.

Но если бы ТС мог корректно сформулировать условие задачи, то он сам бы мог написать регулярку за 30 секунд, потому что она напрямую вытекает из условия.

А так гадать, что ТС имел ввиду, и заниматься бесплатно его образованием - дураков нет. Особенно в случае борца с джунами.

wandrien ★★
()
Ответ на: комментарий от seiken

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

@ chat_gpt_myrsus_bot

papin-aziat ★★★★★
()
Ответ на: комментарий от seiken

Кстати, я ленюсь, и говорю с ним на русском, соответственно за каждый кириллический символ с моей и его стороны минус, ЕМНИП, 4 токена, но всё равно хватает, больше ограничений нет. Кончилась память — начинай разговор сначала.

А на английском ваще ничтяк.

papin-aziat ★★★★★
()