Форум сайта python.su
Здравствуйте столкнулся с проблемой при регулярных выражениях:
В регулярных выражениях есть ретроспективные проверки это ?<= и ?<! и опережающие это ?= и ?!. Они есть положительные и отрицательные. ПОЛОЖИТЕЛЬНЫЕ РАБОТАЮТ ПРАВИЛЬНО А ОТРИЦАТЕЛЬНЫЕ НЕТ.
Позитивная ретроспективная проверка ?<=: (?<=Y)X, ищет совпадение с X при условии, что перед ним ЕСТЬ Y. ЭТА ПРОВЕРКА РАБОТАЕТ НОРМАЛЬНО НА ПРИМЕР: print(re.findall(r'(?<=7)\w+', ‘HISD 7BAS’)) – вернет все что после семерки
Негативная ретроспективная проверка ?<!: (?<!Y)X, ищет совпадение с X при условии, что перед ним НЕТ Y. ЭТА ПРОВЕРКА РАБОТАЕТ НЕ ПРАВИЛЬНО НА ПРИМЕР: print(re.findall(r'(?<!7)\w+', ‘HISD 7BAS’)) – должна вернуть по сути слово HISD а возвращается полностью выражение HISD 7BAS – ПРИЧЕМ В javascript этот код отрабатывает правильно, проблема только в питоне.
Позитивная опережающая проверка ?=: X(?=Y) ишет X при условии что за ним следует Y. ЭТА ПРОВЕРКА РАБОТАЕТ ПРАВИЛЬНО НА ПРИМЕР: print(re.findall(r'\w+\s(?=one)', ‘zet ru is one to be ’)) – вернет только слово ‘is’ как и должно быть.
Негативная опережающая проверка ?!: X(?!Y) ищет X за которым НЕ следует Y. ЭТА ПРОВЕРКА РАБОТАЕТ НЕ ПРАВИЛЬНО НА ПРИМЕР: print(re.findall(r'\w+\s(?!one)', ‘zet ru is one to ’)) – вернет ‘zet ’, ‘ru ’, ‘one ’, ‘to ’ – ‘is’ не возвращается как и должно быть: НО ПОЧЕМУ ВОЗВРАШАЕТСЯ ‘one’ ОНО ВЕДЬ НЕ ДОЛЖНО ВЕРНУТЬСЯ В РЕЗУЛЬТАТ?
Офлайн
artur567297Она не возвращает полностью пыражение HISD 7BAS, как ты пишешь, потому что пробел не может входить в класс символов \w. Ты хоть научись сначала выводить всё правильно и точно.
РАБОТАЕТ НЕ ПРАВИЛЬНО НА ПРИМЕР: print(re.findall(r'(?<!7)\w+', ‘HISD 7BAS’)) – должна вернуть по сути слово HISD а возвращается полностью выражение HISD 7BAS
>>> import re >>> >>> re.findall(r'(?<!7)\w+', 'HISD 7BAS') ['HISD', '7BAS'] >>>
artur567297Какой код в JavaScript отрабатывает правильно? Там такой функции нет даже.
ПРИЧЕМ В javascript этот код отрабатывает правильно, проблема только в питоне.
artur567297Она не возвращает is, а возвращает is с пробелом. У тебя опять что-то не высветилось и ты даже не понимаешь, что именно выводится на экран.
ЭТА ПРОВЕРКА РАБОТАЕТ ПРАВИЛЬНО НА ПРИМЕР: print(re.findall(r'\w+\s(?=one)', ‘zet ru is one to be ’)) – вернет только слово ‘is’ как и должно быть.
>>> import re >>> >>> re.findall(r'\w+\s(?=one)', 'zet ru is one to be ') ['is '] >>>
artur567297
Негативная опережающая проверка ?!: X(?!Y) ищет X за которым НЕ следует Y. ЭТА ПРОВЕРКА РАБОТАЕТ НЕ ПРАВИЛЬНО НА ПРИМЕР: print(re.findall(r'\w+\s(?!one)', ‘zet ru is one to ’)) – вернет ‘zet ’, ‘ru ’, ‘one ’, ‘to ’ – ‘is’ не возвращается как и должно быть: НО ПОЧЕМУ ВОЗВРАШАЕТСЯ ‘one’ ОНО ВЕДЬ НЕ ДОЛЖНО ВЕРНУТЬСЯ В РЕЗУЛЬТАТ?
>>> import re >>> >>> re.findall(r'\w+\s(?!one)', 'zet ru is one to ') ['zet ', 'ru ', 'one ', 'to '] >>>
>>> import re >>> >>> re.findall(r'\w+\s(?=one)', 'one one one one') ['one ', 'one ', 'one '] >>>
Отредактировано py.user.next (Окт. 23, 2023 06:51:36)
Офлайн
py.user.next
Отредактировано artur567297 (Окт. 23, 2023 08:48:31)
Офлайн
artur567297
Но вопрос по re.findall(r'(?<!7)\w+', ‘HISD 7BAS’) - должно вернуться только ‘HISD’ так как выражение
(?<!Y)X, ищет совпадение с X при условии, что перед ним нет Y то есть Y = 7 а семерки нет только перед словом ‘HISD’ поэтому его только должно и вернуть но возврашается ‘HISD’, ‘7BAS’
>>> import re >>> >>> re.findall(r'(?<!7)\w+', 'HISD 7BAS') ['HISD', '7BAS'] >>>
Отредактировано py.user.next (Окт. 23, 2023 15:51:49)
Офлайн
py.user.nextтак и так не помогает:
Офлайн
artur567297
Рабочий код в JS let str = “HISD 7BAS”;
console.log(str.match(/(?<!7)\w+/) ); - возврашает только HISD
-> "HISD BAS".match(/\w+/) <- Array ["HISD"]
-> "HISD 7BAS".match(/(?<!7)\w+/g) <- Array [ "HISD", "7BAS" ]
Отредактировано py.user.next (Окт. 23, 2023 18:12:31)
Офлайн
py.user.nextВ Python функция re.findall() возвращает все вхождения. - так какие вхождения если шаблон (?<!Y)X, ищет совпадение с X при условии, что перед ним нет Y а Y = 7 или Y = \s7 а значит вернуть 7BAS не должен или как???
В Python функция re.findall() возвращает все вхождения.
Офлайн
artur567297Да, если перед ним нет, ну и перед 7BAS нет семёрки. Там пробел перед 7BAS. А пробел это символ такой. И пробел - это не семёрка.
что перед ним нет Y а Y = 7 или Y = \s7 а значит вернуть 7BAS не должен или как?
Офлайн
py.user.nextТам пробел перед 7BAS. - так я могу поставить Y = \s7 все равно вернет 7BAS
Там пробел перед 7BAS.
Офлайн
artur567297Тебе нужно ити в противотанковые войска - любую броню продавишь пальцем
HISD 7BAS
import re st = "HISD 7BAS 7HUYAS" pattern = r'\b[^\W7]+\b' matches = re.findall(pattern, st) print(matches) ["HIDS"]
Офлайн