Как найти хотя бы одну из двух групп в Python Regex, когда вы ищете третью группу, которая является обязательной? - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь использовать регулярные выражения, чтобы найти неправильно используемые операторы в моей программе.

В частности, я пытаюсь выяснить, использовались ли некоторые операторы (скажем,%, $ и @) без цифр по обеим сторонам.

Вот несколько примеров неправильного использования:

'5%'
'%5'
'5%+3'
'5%%'

Есть ли способ сделать это с помощью одного re.search?

Я знаю, что могу использовать + как минимум для одного или * для хотя бы нуля, но, глядя на:

([^\d]*)(%)([^\d]\*)

Я хотел бы найти случаи, когда хотя бы один из группы (1) и группа (3) существует,
, поскольку вставка% с цифрами на обеих его сторонах является хорошим использованием оператора.

Я знаю, что мог бы использовать:

match = re.search(r'[^\d\.]+[@$%]', user_request)
if match: 
    return 'Illegal use of match.group()'

match = re.search(r'[@$%][^\d\.]+', user_request)
if match: 
    return 'Illegal use of match.group()'

Но я бы предпочел сделать это с одной строкой re.search.

А также - когда я использую [^\ d.] это включает начало и конец строки?Или только разные символы?

Спасибо:)

1 Ответ

0 голосов
/ 24 декабря 2018

Вы можете использовать чередование с отрицательным взглядом вперед и отрицательным взглядом сзади, чтобы утверждать, что до и после - не цифра:

(?<!\d)[@$%]|[@$%](?!\d)

Это будет соответствовать:

  • (?<!\d) Отрицательный взгляд позади, чтобы проверить, что слева не является цифрой
  • [@$%] Класс символов, соответствует одному из @, $ или %
  • | Или
  • [@$%] Класс символов, соответствующий одному из @, $ или %
  • (?!\d) Отрицательный взгляд, чтобы проверить, что справа не является цифрой

Например:

match = re.search(r'(?<!\d)[@$%]|[@$%](?!\d)', user_request)
if match: 
    return 'Illegal use of match.group()'

Regex demo | Демонстрация Python

[^\d.] Соответствует не цифре или буквальной точке.^ внутри класса символов отрицает то, что в нем содержится.Но если это первый символ строки, который не является цифрой или точкой, он будет совпадать.

...