Regex для расширенного синтаксиса индексирования numpy - как работать с необязательной конечной запятой - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь создать регулярное выражение, соответствующее подмножеству синтаксиса расширенного индексирования Python для многомерных массивов.

Пока у меня есть следующее:

^[_a-zA-Z]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,\s*)*\]\s*\]$

Это регулярное выражение может соответствоватьуспешно следующее:

a[[10,]]
a[[+10,-10,20,]]
a [ [ + 10 , - 10 , 20 , ] ]
a[[]]

Однако завершающая запятая в списках Python является необязательной и не требуется.К сожалению, мое регулярное выражение не может проверить следующее:

a[[10]]
a[[10,10]]

Обратите внимание на пропущенную запятую в конце внутренних скобок.Если я добавлю ? рядом с , моего шаблона регулярных выражений, то приведенный выше шаблон будет проверен.Однако тогда регулярное выражение также проверяет элементы, которые являются числовыми выражениями (например,: a[[10+10,10]]), что нежелательно.

По сути, я хочу иметь список целых чисел во внутренних квадратных скобках, разделенных запятыми и допускать запятую.Кроме того, эти номера могут иметь префикс - или +.

Может ли кто-нибудь предоставить мне решение, которое подтверждает шаблон, описанный выше?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2019

Необходимо смешать опционально с требуемым, точным способом.

^[_a-zA-Z]\w*\s*\[\s*\[(?:\s*(?:[-+]\s*)?[1-9][0-9]*(?:\s*,\s*(?:[-+]\s*)?[1-9][0-9]*)*(?:\s*,)?\s*)?\]\s*\]$

https://regex101.com/r/D3wzYb/1

Расширенное

 ^    
 [_a-zA-Z] 
 \w* \s* \[ \s* \[ 
 (?:
      \s* 
      (?: [-+] \s* )?
      [1-9] [0-9]* 
      (?:
           \s* , \s* 
           (?: [-+] \s* )?
           [1-9] [0-9]* 
      )*
      (?: \s* , )?
      \s* 
 )?
 \] \s* \] 
 $
1 голос
/ 29 сентября 2019

Вы можете изменить свое регулярное выражение, добавив дополнительный номер , за которым не следует запятая до закрытия ]:

^[_a-zA-Z]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,\s*)*(\s*[-+]?\s*[1-9][0-9]*\s*)?\]\s*\]$

Демонстрация для регулярного выражения regex101

1 голос
/ 29 сентября 2019

Может быть,

(?i)(?!.*\d\s*[+*%-]\s*\d)^[a-z_]\w*\s*\[\s*\[(\s*[-+]?\s*[1-9][0-9]*\s*,?\s*)*\]\s*\]$

сделает тогда.

Демо

Здесь мы потерпим неудачу в этих нежелательных операциях, используя некоторое подвыражение, такое как

(?!.*\d\s*[+*%-]\s*\d)

, и добавим его внапример, начало нашего выражения.

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