Совпадение нескольких конкретных позиций - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть регулярное выражение, подобное этому

/^((.{0}1.*)|(.{1}2.*)|(.{2}3.*)|(.{3}4.*))$/g

И это соответствует каждой строке, которая содержит почти одну цифру в той же позиции 1234.

Теперь я пытаюсь построитьрегулярное выражение, которое соответствует почти n цифрам в той же позиции 1234. Не важно, какая цифра соответствует, но эта n цифра соответствует.Так что использование оператора AND здесь не поможет.Идея состоит в том, чтобы создать регулярное выражение, которое соответствует каждому характеру в правильном положении, а затем в моем коде на Python я напишу что-то вроде:

n_matches = len(re.findall(regex, val))
if n_matches == matches_to_hit:
    ...

Но я застрял здесь ... любая идея?

ОБНОВЛЕНИЕ

У меня есть 2 строки на входах.Они всегда представляют собой строку из 4 цифр.Диапазон цифр 0-9 и все цифры разные.Например:

  • 123 NOT VALID
  • 1234 VALID
  • 9874 VALID
  • 1231 NOT VALID
  • 12345 NOT VALID

Я должен проверить, имеют ли вход A и вход B n цифр в одном и том же положении

Пример:

  • Вход A = 9837
  • Вход B = 1234

Таким образом, если n равно 1, регулярное выражение должно возвращать метку.Если n> 1 нет, потому что только цифра 3 находится на одной и той же позиции на входе A и входе B.

1 Ответ

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

Я не уверен, что я правильно понял ваш ответ на 100%, но я понял его следующим образом: написать регулярное выражение, соответствующее строке "с ровно 4 цифрами в качестве первых 4 символов, все из которых отличаются, и никаких других цифр вstring "

Этого можно достичь с помощью негативных предупреждений и обратных ссылок (и групп).Регулярное выражение работает следующим образом:

Таким образом, у нас должна быть цифра \d.Затем другая цифра \d, которая не совпадает с первой [match] (?!\1).Затем другая цифра \d, которая не совпадает с предыдущими совпадениями (?!(\1|\2)) и т. Д.

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

/^
  (\d)
  (?!\1)(\d)
  (?!(\1|\2))(\d)
  (?!(\1|\2|\3))(\d)
  \D*
  $
/x

Если вынеобходимо, чтобы он совпадал со всей строкой и некоторыми определенными позициями, вы можете удалить ^ / $ и посыпать \D (не цифрой) такими квантификаторами, как *, + из {10} при необходимости.

PS: я предлагаю прочитать этот сайт https://www.regular -expressions.info / и после прочтения всего этого и некоторой практики (кстати, ответы на вопросы здесь на StackOverflow - хороший способ потренироватьсяЯ обещаю, что вы станете гуру регулярных выражений.

PPS: В реальном проекте я бы вообще реализовал это без регулярных выражений.

digits = [c for c in str if c.isdigit()]
return len(digits) == 4 and len(set(digits)) == 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...