Форум программистов
 
О проблемах с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 27.01.2021, 20:02   #1
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 2,453
По умолчанию Нахождение текста с % в начале и в конце

код:
Код:
import re
text = ';%повлекли% радость;'
print(re.findall(r"%[ ,^а-яА-Я]+%", text))
делает, то что надо, но стоит изменить на
Код:
text = ';%повлек%ли% радость;'
предполагается ответ - ['%повлек%', '%ли%']
а он такой: ['%повлек%']
как это исправить? спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 27.01.2021, 22:30   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,869
По умолчанию

Это получаются пересекающиеся совпадения. Можно пожертвовать последним %:
Код:
print(re.findall(r"%[ ,^а-яА-Я]+(?=%)", text))
Или использовать модуль regex и вызывать findall с флагом overlapping.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.01.2021, 08:05   #3
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 2,453
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Или использовать модуль regex и вызывать findall с флагом overlapping.
никогда с этим флагом не встречался, подскажите эту строку кода, спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 28.01.2021, 09:48   #4
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 2,453
По умолчанию

еще подскажите, пжл
про знак "^" - почему он в коде без экранирования, а работает?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 28.01.2021, 10:10   #5
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 2,453
По умолчанию

Код:
text1 = ';%повлек%ли% рад%о%сть;'
print(re.findall(r'%+[ ,^а-яА-Я]+(?=%)', text1))
выводит
['%повлек', '%ли', '% рад', '%о']
как-бы от % избавиться-чтобы был аналог сплита("%")
как отдельно сделать это понятно, может можно изначально без % искать?
Ципихович Эндрю вне форума Ответить с цитированием
Старый 28.01.2021, 18:33   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,869
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
никогда с этим флагом не встречался, подскажите эту строку кода, спс
Код:
import regex as re
text = ';%повлек%ли% радость;'
print(re.findall(r"%[ ,^а-яА-Я]+%", text, overlapped = True))
Но код не запускал, так как лень качать лишний модуль.

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
про знак "^" - почему он в коде без экранирования, а работает?
Тонкостей регулярок питона не знаю (отличий от POSIX), но если судить по статье на вики про регулярные выражения, то:
Цитата:
Внутри символьного класса специальные значения символов, в основном, игнорируются. Особые случаи:
Чтобы добавить символ ^ в набор, его следует поместить туда не первым.
Поэтому он ведет себя как обычный символ.

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
может можно изначально без % искать?
Код:
print(re.findall(r'(?<=%)[ ,^а-яА-Я]+(?=%)', text))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 28.01.2021, 19:20   #7
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 2,453
По умолчанию

спс, инфу читал
'.' - НЕэкранированная точка, будет искать любой символ, кроме перевода строки, с флагом DOTALL — также и перевод строки
'*' знак звёздочки означает «ноль или более», то же самое, что и {0,}, то есть символ может повторяться много раз или вообще отсутствовать
Код:
spl = ';%повлек%ли% радость;'
print(re.findall(r'(?<=%)+[.*]+(?=%)', spl, re.DOTALL))
почему не получается сплит по % - ну то есть всё, всё, а не [ ,^а-яА-Я]
как подправить? спс
Ципихович Эндрю вне форума Ответить с цитированием
Старый 29.01.2021, 06:08   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 5,869
По умолчанию

Код:
print(re.findall(r'(?<=%).*?(?=%)', spl, re.DOTALL))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.01.2021, 07:43   #9
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 2,453
По умолчанию

то, что нужно, спс
Ципихович Эндрю вне форума Ответить с цитированием
Ответ
Купить рекламу на форуме 20000 рублей в месяц

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как добавить текст в начале и в конце каждой строки mitiay Общие вопросы Delphi 7 13.10.2015 13:15
Как добавить кавычки в начале и конце ячейки? Paul01 Microsoft Office Excel 3 19.05.2011 14:04
Удаление пустых строк в начале и в конце документа Jetro Microsoft Office Word 4 25.04.2011 20:14
FASM (assembler). Удалить пробелы в начале и в конце строки Zart Помощь студентам 4 23.04.2011 20:18
Аналог функции Trim-удаление лишних пробелов в начале и в конце передаваемой строки GULINA Помощь студентам 6 23.05.2009 14:07


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS