Форум сайта python.su
0
В регулярках есть операция ИЛИ |
Похоже, что операция AND (&) отсутствует.
Подскажите, как наиболее просто организовать эту операцию.
Требуется в массиве строк, содержащих по несколько слов, найти такие строки, в которых встречались бы, например два слова. Слово№1 И (AND (&)) Слово№2.
Офлайн
>>> s = 'qwerty' >>> 'qwe' in s and 'rty' in s True >>>
Офлайн
253
ewroА как вы представляете себе ситуацию когда в данной строке в данном месте должно быть одновременно несколько разных выражений?
Похоже, что операция AND (&) отсутствует.
Офлайн
0
Допустим у меня есть массив строк. Что-то вреде такого:
Монитор большой белый
Монитор маленький белый
Монитор маленький черный
Телевизор маленький черный
Требуется найти строку с таким сочетанием - “Монитор” AND “черный”
т.е. предполагается нахождение третьей строки - “Монитор маленький черный”
Спасибо за ответы!
Офлайн
>>> l='''Монитор большой белый Монитор маленький белый Монитор маленький черный Телевизор маленький черный'''.strip().split('\n') >>> for i in l: if 'Монитор' in i and 'черный' in i: print(l.index(i),i) 2 Монитор маленький черный >>>
Офлайн
0
Еще раз спасибо за ответы. Оба примера работают!
Все же вопрос - через регулярные выражения - никак?
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)
Видимо предстоят танцы с бубном.
Офлайн
294
ewroможно и через re
Все же вопрос - через регулярные выражения - никак?
import re s = '''Монитор большой белый монитор маленький белый Монитор маленький черный Телевизор маленький черный еще монитор условно белый Монитор небелый '''.strip().split('\n') for line in s: res = re.findall(r'(.*\b[Мм]онитор\b.+\bбелый\b.*)',line) if res: print(res) >>> ['Монитор большой белый'] ['монитор маленький белый'] ['еще монитор условно белый'] >>>
[code python][/code]
Отредактировано PEHDOM (Май 29, 2018 22:52:38)
Офлайн
857
ewroНадо сделать для каждого слова отдельное регулярное выражение и добавить эти регулярные выражения в список. А потом для каждой строки искать совпадение с каждым регулярным выражением в списке. Для решения вопросов с регистром надо передавать флажок re.IGNORECASE.
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)
Офлайн
253
ewro
Просто предполагалось, что ввод поискового запроса будет через консоль.
Например: Монитор AND Белый AND (Пластмассовый OR Металлический)
PEHDOMЭто не И а оператор следования, что и в документации написано. И в данной области применения логически невозможен…. те для аналога (abs)|(dfg) те для (abs)&(dfg) никогда не будет совпадений. Такой оператор бессмысленнен.
в re оператор AND кагбе используеться по умолчанию…
Отредактировано doza_and (Май 30, 2018 08:34:37)
Офлайн
294
doza_andну вобщем таки да, наверно я неправильно выразился, конечно же это не полноченное И так как оно ищет только в стройгой последовательности, на что я указал ниже.
Это не И а оператор следования, что и в документации написано. И в данной области применения логически невозможен
'(?=.*\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) >>> ['Монитор большой белый'] ['монитор маленький белый'] ['Монитор маленький черный'] ['еще монитор условно белый'] ['белый монитор без подставки'] ['черный монитор без БП'] ['черный монитор маленький'] >>>
[code python][/code]
Отредактировано PEHDOM (Май 30, 2018 10:58:51)
Офлайн