Как на самом деле работает исключение строк с использованием регулярных выражений - PullRequest
0 голосов
/ 18 декабря 2018

Мне неясно, как работают отрицательные регулярные выражения.Я проследовал за несколькими постами ( post 1 , post 2 ,) и использовал их шаблоны, и они работают, но их объяснения не имеют смысла для меня.Я пробовал несколько сайтов-тестеров regex, таких как regex101 и т. Д., Но они не в состоянии обрабатывать шаблоны, которые работают в Python, как показано в постах 1 и 2.

Мой предпочтительный подход заключается в том, что regex будет вести себя длянегативная логика так же, как она ведет себя для позитивной логики.Однако мне кажется, что, как только отрицательная логика используется, она начинает совершенно новый способ обработки, которому трудно следовать.Я знаю, что для этого есть обходные пути, но мне интересно понять это с помощью регулярных выражений.

Цель следующих примеров: Скажем, у меня есть список товаров, из которого я хотел бы получить список, которыене «газ», как определено переменной except.Другими словами, мне нужен список продуктов, которые не содержат слова «газ» в названии.

Вот вспомогательный код для проверки различных идей:

import re
cmdty = ['natural gas', 'Henry Hub Natural Gas Contract', 'Crude Oil', 'Brent', 'WTI']
expect= cmdty[-3:] # i.e. ['Crude Oil', 'Brent', 'WTI']
print(f'Starting list: {cmdty}. Would like to get: {expect}')
def check (pattern,cmdty=cmdty, expect=expect, comment=""): 
    out = [c for c in cmdty if re.search(pattern,c)]
    good = "yes" if set(out) == set(expect) else "no"
    print(f'pattern={pattern:20}: worked: {good:>3}. output={out}. comment: {comment}')

Различные попытки регулярных выражений заставить его работать:

check(pattern='(?i)(?=gas)',comment="This one works, but requires negating the results")
check(pattern='(?i)(?!gas)',comment="My hope was that this would work")
check('(?i)(?:!gas)',comment="")
check('(?i)\s(?!gas)',comment="strange outcome")
check('(?i).*(?!gas).*')
check('^(?i)(?!.*gas).*$', comment='works')
check('^(?i)((?!gas).)*$', comment='not sure this one works')
check('(?i)^.*(?!gas).*$',comment="I'd expect this one to work, but does not")
check('(?i)^(?!.*gas).*$', comment='works')
check('(?i)nat(?!gas)', comment='makes sense, but super odd')

Исходный список и цель:

Starting list: ['natural gas', 'Henry Hub Natural Gas Contract', 'Crude Oil', 'Brent', 'WTI'].

Would like to get: ['Crude Oil', 'Brent', 'WTI']

Вот выходные результаты, использующие различные попытки заставить его работать.Какой способ думать об этом, так это имеет смысл.

pattern=(?i)(?=gas)         : worked:  no. output=['natural gas', 'Henry Hub Natural Gas Contract']. comment: This one works, but requires negating the results
pattern=(?i)(?!gas)         : worked:  no. output=['natural gas', 'Henry Hub Natural Gas Contract', 'Crude Oil', 'Brent', 'WTI']. comment: My hope was that this would work
pattern=(?i)(?:!gas)        : worked:  no. output=[]. comment: 
pattern=(?i)\s(?!gas)       : worked:  no. output=['Henry Hub Natural Gas Contract', 'Crude Oil']. comment: strange outcome
pattern=(?i).*(?!gas).*     : worked:  no. output=['natural gas', 'Henry Hub Natural Gas Contract', 'Crude Oil', 'Brent', 'WTI']. comment: 
pattern=^(?i)(?!.*gas).*$   : worked: yes. output=['Crude Oil', 'Brent', 'WTI']. comment: works
pattern=^(?i)((?!gas).)*$   : worked: yes. output=['Crude Oil', 'Brent', 'WTI']. comment: not sure this one works
pattern=(?i)^.*(?!gas).*$   : worked:  no. output=['natural gas', 'Henry Hub Natural Gas Contract', 'Crude Oil', 'Brent', 'WTI']. comment: I'd expect this one to work, but does not
pattern=(?i)^(?!.*gas).*$   : worked: yes. output=['Crude Oil', 'Brent', 'WTI']. comment: works
pattern=(?i)nat(?!gas)      : worked:  no. output=['natural gas', 'Henry Hub Natural Gas Contract']. comment: makes sense, but super odd`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...