Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2018 16:37:31

ewro
Зарегистрирован: 2017-11-03
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

В регулярках есть операция ИЛИ |
Похоже, что операция AND (&) отсутствует.
Подскажите, как наиболее просто организовать эту операцию.
Требуется в массиве строк, содержащих по несколько слов, найти такие строки, в которых встречались бы, например два слова. Слово№1 И (AND (&)) Слово№2.

Офлайн

#2 Май 29, 2018 19:25:36

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Опреция AND & в регулярных выражениях

 >>> s = 'qwerty'
>>> 'qwe' in s and 'rty' in s
True
>>> 

Офлайн

#3 Май 29, 2018 19:31:01

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

ewro
Похоже, что операция AND (&) отсутствует.
А как вы представляете себе ситуацию когда в данной строке в данном месте должно быть одновременно несколько разных выражений?
Мне кажется что это невозможно.



Офлайн

#4 Май 29, 2018 19:55:27

ewro
Зарегистрирован: 2017-11-03
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

Допустим у меня есть массив строк. Что-то вреде такого:
Монитор большой белый
Монитор маленький белый
Монитор маленький черный
Телевизор маленький черный
Требуется найти строку с таким сочетанием - “Монитор” AND “черный”
т.е. предполагается нахождение третьей строки - “Монитор маленький черный”
Спасибо за ответы!

Офлайн

#5 Май 29, 2018 20:11:32

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Опреция AND & в регулярных выражениях

 >>> l='''Монитор большой белый
Монитор маленький белый
Монитор маленький черный
Телевизор маленький черный'''.strip().split('\n')
>>> for i in l:
	if 'Монитор' in i and 'черный' in i: print(l.index(i),i)
2 Монитор маленький черный
>>> 

Офлайн

#6 Май 29, 2018 20:20:39

ewro
Зарегистрирован: 2017-11-03
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

Еще раз спасибо за ответы. Оба примера работают!
Все же вопрос - через регулярные выражения - никак?
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)
Видимо предстоят танцы с бубном.

Офлайн

#7 Май 29, 2018 22:30:05

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

ewro
Все же вопрос - через регулярные выражения - никак?
можно и через re
в re оператор AND кагбе используеться по умолчанию…

 import re
s = '''Монитор большой белый
монитор маленький белый
Монитор маленький черный
Телевизор маленький черный
еще монитор условно белый
Монитор небелый
'''.strip().split('\n')
for line in s:
    res = re.findall(r'(.*\b[Мм]онитор\b.+\bбелый\b.*)',line)
    if res:
        print(res)
>>> 
['Монитор большой белый']
['монитор маленький белый']
['еще монитор условно белый']
>>>
но это если у вас идет строгое сочетание монитор+ белый, а если нужно любое сочетание то тут уже сложнее, нкжно или составлять несколько паттернов разделяя их с посощюь OR или использовать просмотры(?=…)(?<=…). като так.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 29, 2018 22:52:38)

Офлайн

#8 Май 29, 2018 23:59:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

ewro
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)
Надо сделать для каждого слова отдельное регулярное выражение и добавить эти регулярные выражения в список. А потом для каждой строки искать совпадение с каждым регулярным выражением в списке. Для решения вопросов с регистром надо передавать флажок re.IGNORECASE.



Офлайн

#9 Май 30, 2018 08:30:32

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

ewro
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)

Если вас не устраивают существующие языки (которые вполне устраивают всех остальных) то вам надо писать свой язык (это называется DSL https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA)

Для его разработки подойдет pyparsing например.
PEHDOM
в re оператор AND кагбе используеться по умолчанию…
Это не И а оператор следования, что и в документации написано. И в данной области применения логически невозможен…. те для аналога (abs)|(dfg) те для (abs)&(dfg) никогда не будет совпадений. Такой оператор бессмысленнен.

А выражение Монитор AND Белый AND (Пластмассовый OR Металлический)
Надо писать так:
Монитор +Белый +(Пластмассовый | Металлический)
Что даже короче.



Отредактировано doza_and (Май 30, 2018 08:34:37)

Офлайн

#10 Май 30, 2018 10:31:45

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Опреция AND & в регулярных выражениях

doza_and
Это не И а оператор следования, что и в документации написано. И в данной области применения логически невозможен
ну вобщем таки да, наверно я неправильно выразился, конечно же это не полноченное И так как оно ищет только в стройгой последовательности, на что я указал ниже.
полноценно же пересечение в re возможно сымитировать с помощью опережающих проверок, и в этом случае AND будет просто последовательным перечислением выборки.
Например для выражения монитор AND (белый OR черный) регулярка будет выглядеть както так:
 '(?=.*\b[Мм]онитор\b)(?:(?=.*\bбелый\b)|(?=.*\bчерный\b))(.*)'
при этом оно захватит сочетание слов “монитор” и “белый”|“черный” в любой последовательности.

 import re
s = '''Монитор большой белый
монитор маленький белый
Монитор маленький черный
Телевизор маленький черный
еще монитор условно белый
Монитор чернобелый
белый монитор без подставки
черный телевизор без пульта
черный монитор без БП
черный монитор маленький
большой  белый телевизор
'''.strip().split('\n')
for line in s:
    res = re.findall(r'(?=.*\b[Мм]онитор\b)(?:(?=.*\bбелый\b)|(?=.*\bчерный\b))(.*)',line)
    
    if res:
        print(res)
>>>
['Монитор большой белый']
['монитор маленький белый']
['Монитор маленький черный']
['еще монитор условно белый']
['белый монитор без подставки']
['черный монитор без БП']
['черный монитор маленький']
>>> 
ЗЫ вопрос целесообразности такого подхода предлагаю оставить за бортом.
ЗЗЫ топискстартеру немного ликбеза https://habr.com/post/143857/



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 30, 2018 10:58:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version