Найти - Пользователи
Полная версия: Опреция AND & в регулярных выражениях
Начало » Python для новичков » Опреция AND & в регулярных выражениях
1 2
ewro
В регулярках есть операция ИЛИ |
Похоже, что операция AND (&) отсутствует.
Подскажите, как наиболее просто организовать эту операцию.
Требуется в массиве строк, содержащих по несколько слов, найти такие строки, в которых встречались бы, например два слова. Слово№1 И (AND (&)) Слово№2.
vic57
 >>> s = 'qwerty'
>>> 'qwe' in s and 'rty' in s
True
>>> 
doza_and
ewro
Похоже, что операция AND (&) отсутствует.
А как вы представляете себе ситуацию когда в данной строке в данном месте должно быть одновременно несколько разных выражений?
Мне кажется что это невозможно.
ewro
Допустим у меня есть массив строк. Что-то вреде такого:
Монитор большой белый
Монитор маленький белый
Монитор маленький черный
Телевизор маленький черный
Требуется найти строку с таким сочетанием - “Монитор” AND “черный”
т.е. предполагается нахождение третьей строки - “Монитор маленький черный”
Спасибо за ответы!
vic57
 >>> l='''Монитор большой белый
Монитор маленький белый
Монитор маленький черный
Телевизор маленький черный'''.strip().split('\n')
>>> for i in l:
	if 'Монитор' in i and 'черный' in i: print(l.index(i),i)
2 Монитор маленький черный
>>> 
ewro
Еще раз спасибо за ответы. Оба примера работают!
Все же вопрос - через регулярные выражения - никак?
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)
Видимо предстоят танцы с бубном.
PEHDOM
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 или использовать просмотры(?=…)(?<=…). като так.
py.user.next
ewro
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)
Надо сделать для каждого слова отдельное регулярное выражение и добавить эти регулярные выражения в список. А потом для каждой строки искать совпадение с каждым регулярным выражением в списке. Для решения вопросов с регистром надо передавать флажок re.IGNORECASE.
doza_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 Металлический)
Надо писать так:
Монитор +Белый +(Пластмассовый | Металлический)
Что даже короче.
PEHDOM
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/
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB