Регулярное выражение Python findall () возвращает нежелательные подстроки (включая правильный ответ) - PullRequest
1 голос
/ 22 апреля 2019

Мне нужно написать функцию python, которая получает строку кода в качестве входных данных и возвращает true, если эта строка содержит троичный оператор (и считает их!), Иначе false.Я написал несколько версий регулярных выражений, которые отлично работали на этом сайте https://regexr.com/,, но, например, в Google Colab ни одна из них не работала.

def ternaryOp(line):
  found_operator=re.findall(r'(((=|==|<|>|<=|>=|!=)[\s\t]*)?[\s\t]*.+[\s\t]*\?[\s\t]*((.+:.*)|(.*:.+)))',line)
  if found_operator:
      print(len(found_operator))
      print(found_operator)
      return True
  else:
    return False


ternaryOp('category=age<18?child:adult')

Ожидаемый результат:

1
[('category=age<18?child:adult')]
True

Фактический результат:

6
[('category=age<18?child:adult', '', '', 'child:adult', 'child:adult', '')]
True

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Я думаю, что нашел решение, которое работает для меня.Спасибо всем!

re.findall(r'(?:(?:=|==|<|>|<=|>=|!=)?[\s\t]*[\s\t]*[^?:]+[\s\t]*\?[\s\t]*(?:.*?:[^ ]*))')
0 голосов
/ 22 апреля 2019

Он делает именно то, что должен и документально подтвержден :

Если в шаблоне присутствует одна или несколько групп, вернуть список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включены в результат.

Ваше регулярное выражение имеет 6 групп захвата, поэтому каждое совпадение представляет собой 6-кортеж, причем каждый элемент кортежа является группой захвата. Либо работайте с этим, либо используйте группы без захвата ((?:pattern)) для групп, которые вас не особо интересуют, или используйте re.finditer, что дает совпадение с объектами и, таким образом, намного более богатые и более гибкие результаты.

Кстати, вы работаете очень неэффективно, если вы просто хотите знать, что шаблон может быть найден в строке, используйте re.match или re.search, код, который вы публикуете здесь, не нуждается в возможностях findall так как вы просто проверяете, нашел ли он что-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...