Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2024, 13:59   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Не понял, что именно нужно найти. Если номера полностью, то:
Код:
pattern = r"(([1-9](\.\d+)+)(( - |, )([1-9](\.\d+)+))?)\s"
matches = re.findall(pattern, html_PDD)
for m, match in enumerate(matches, 1):
    print(f"{m}. {match[0]}")
А чтобы не было последней строки с тире между номерами и названием:
Код:
pattern = r"(([1-9](\.\d+)+)(( - |, )([1-9](\.\d+)+))?)\s(?!-)"
matches = re.findall(pattern, html_PDD)
for m, match in enumerate(matches, 1):
    print(f"{m}. {match[0]}")
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 12.08.2024 в 14:26.
BDA вне форума Ответить с цитированием
Старый 12.08.2024, 14:08   #12
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,167
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Не понял, что именно нужно найти
чтобы искало:
1.13 "Крутой спуск"
1.14 "Крутой подъем"
1.11.1, 1.11.2 "Опасный поворот"
1.4.1 - 1.4.6 "Приближение к железнодорожному переезду"
чтобы НЕ искало
1.12.1, 1.12.2 - "Опасные повороты" - уже не подходит из-за тире
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.08.2024, 14:27   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Код:
pattern = r'(([1-9](\.\d+)+)(( - |, )([1-9](\.\d+)+))?\s".+?")'
matches = re.findall(pattern, html_PDD)
for m, match in enumerate(matches, 1):
    print(f"{m}. {match[0]}")
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.08.2024, 15:08   #14
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,167
По умолчанию

какая бы гениальная регулярка не была, а напильник понадобился:
Код:
text = text.replace(' <*>', '')
спасибо, то что нужно:
Код:
    patchPDD = r'I:\Российская Федерация\4. ПДД РФ_02.06.2023.htm'
    with open(patchPDD, 'r', encoding='utf-8') as f_in:
        html_PDD = f_in.read()
    soup = BeautifulSoup(html_PDD, 'html.parser')
    text = soup.get_text()
    text = text.replace(' <*>', '')
    # Регулярное выражение для поиска нужных фрагментов
    pattern = r'(([1-9](\.\d+)+)(( - |, )([1-9](\.\d+)+))?\s".+?")'
    matches = re.findall(pattern, text)
    for m, match in enumerate(matches, 1):
        print(f"{m}. {match[0]}")
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.08.2024, 15:46   #15
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,167
По умолчанию

на такой мелочи сыплюсь......
подскажите код:
Код:
    patchPDD = r'I:\Российская Федерация\4. ПДД РФ_02.06.2023.htm'
    with open(patchPDD, 'r', encoding='utf-8') as f_in:
        html_PDD = f_in.read()
    soup = BeautifulSoup(html_PDD, 'html.parser')
    text = soup.get_text()
    text = text.replace(' <*>', '')
    # Регулярное выражение для поиска нужных фрагментов
    pattern = r'(([1-9](\.\d+)+)(( - |, )([1-9](\.\d+)+))?\s".+?")'
    matches = re.findall(pattern, text)
    mat_zpt_tire = []
    for m, match in enumerate(matches, 1):
        mat = match[0]
        print(f"{m}. {mat}")
        if ", " in mat.split()[0]: mat_zpt_tire.append(mat)
        if " - " in mat.split()[0]: mat_zpt_tire.append(mat)
    print(mat_zpt_tire)
почему в итоге список mat_zpt_tire пустой? ведь условия if ", " и if " - " должны были в него добавить текст
так как в ответах имеется:
.......
236. 8.20.1, 8.20.2 "Тип тележки транспортного средства"
237. 8.21.1 - 8.21.3 "Вид маршрутного транспортного средства"
.......

Последний раз редактировалось Ципихович Эндрю; 12.08.2024 в 15:48.
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.08.2024, 16:04   #16
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,167
По умолчанию

разобрался нужно было сплитовать по '"'
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.08.2024, 16:34   #17
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
разобрался нужно было сплитовать по '"'
Не нужно. В match уже все нужное есть, нужно просто проверить правильную группу из регэкспа:
Код:
mat_zpt_tire = []
for m, match in enumerate(matches, 1):
    mat = match[0]
    print(f"{m}. '{mat}'")
    if match[4]:
        mat_zpt_tire.append(mat)
print(mat_zpt_tire)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.08.2024, 20:50   #18
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,167
По умолчанию

BDA, спасибо разобрался:
Когда используется re.findall с шаблоном, содержащим группы захвата (т. е. скобки ()), функция возвращает список кортежей, где каждый кортеж содержит все совпадение и каждую группу захвата.
В этом случае шаблон имеет несколько групп захвата, поэтому match будет кортежем, содержащим каждую из этих групп. Если говорить точнее, шаблон имеет 7 групп захвата.
В коде if match[4]: проверяет, является ли 5-й элемент кортежа соответствия «истинным».
В Python при использовании индексации кортежа, например match[4], возвращается элемент с индексом 4 кортежа. Поскольку индексы кортежа начинаются с 0, match[4] ссылается на 5-й элемент кортежа. В этом конкретном случае 5-й элемент кортежа соответствия соответствует группе захвата ( - |, ), которая соответствует либо пробелу, за которым следует дефис (-), либо запятой (,). Оператор if проверяет, является ли этот элемент «истинным», то есть он не пустой, не None и не является «ложным» значением, например 0, «», или []. Другими словами, if match[4]: спрашивает: «Есть ли в совпадении разделитель (либо -, либо ,)?»
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.08.2024, 21:20   #19
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,167
По умолчанию

BDA подскажите, а эти засады с наличием "-" и "," так расписать или можно покороче?
Код:
        if match[4]:
            if mat == '1.4.1 - 1.4.6 "Приближение к железнодорожному переезду"':
                mat_res.append('1.4.1 "Приближение к железнодорожному переезду"')
                mat_res.append('1.4.2 "Приближение к железнодорожному переезду"')
                mat_res.append('1.4.3 "Приближение к железнодорожному переезду"')
                mat_res.append('1.4.4 "Приближение к железнодорожному переезду"')
                mat_res.append('1.4.5 "Приближение к железнодорожному переезду"')
                mat_res.append('1.4.6 "Приближение к железнодорожному переезду"')
            elif mat == '1.11.1, 1.11.2 "Опасный поворот"':
                mat_res.append('1.11.1 "Опасный поворот"')
                mat_res.append('1.11.2 "Опасный поворот"')
Ципихович Эндрю вне форума Ответить с цитированием
Старый 12.08.2024, 22:35   #20
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Можно более обще (без конкретных строк):
Код:
pattern = r'(([1-9]\d*(?:\.[1-9]\d*)*)(?:\.([1-9]\d*))(?:(?:( - )|(, ))\2(?:\.([1-9]\d*)))?(\s".+?"))'
matches = re.findall(pattern, html_PDD)
res = []
for m, match in enumerate(matches, 1):
    print(f"{m}. {match[0]}")
    if match[4]:
        res.append(match[1] + '.' + match[2] + match[6])
        res.append(match[1] + '.' + match[5] + match[6])
    elif match[3]:
        res.extend(match[1] + '.' + str(i) + match[6] for i in range(int(match[2]), int(match[5]) + 1))
    else:
        res.append(match[0])
print(res)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как спарсить данные с онлайн словаря в excel? Xillin Microsoft Office Excel 4 22.08.2017 04:42
Как спарсить NIKOLAYY2 Общие вопросы Delphi 13 29.03.2015 16:06
Спарсить данные из тега XML FleXik Общие вопросы Delphi 8 19.10.2014 02:39
Спарсить данные с кукисов snip4ik Работа с сетью в Delphi 3 05.03.2013 21:34
Спарсить строку (скопировать до и после пробела данные) sxcine Помощь студентам 3 10.11.2010 19:22