Неверный шаблон выражения в Python - PullRequest
0 голосов
/ 15 января 2019

Например, строка - '10S#9D7T*'.
Мой результат желаний - 3 массива.[('10S#'), ('9D'), ('7T*')]

Имеется 3 условия.

  1. Первый диапазон из одной или двух цифр всегда равен 0 ~ 10.
  2. И следующий за ним символ всегда находится.1011 *
  3. И следуйте '#' или '*'.Но это не обязательно.

Это мой код.

rex = re.compile(r'\d?\d\w?[\*\#]')
str = '10S#9D7T'
print(rex.findall(str))

Acutal Result -> ['10S#']

Существует только один массив.

пожалуйста, исправьте мой шаблон регулярных выражений.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете изменить \d?\d на \d{1,2}, и поскольку следующий символ всегда присутствует, он не должен быть необязательным, чтобы вы могли опустить знак вопроса. Символы * и # не обязательно должны быть экранированы в классе персонажа и добавлять к нему знак вопроса, чтобы сделать его необязательным.

Вы можете использовать:

\d{1,2}\w[*#]?

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

  • \d{1,2} Совпадение 1-2 цифры
  • \w Соответствует символу слова
  • [*#]? Необязательный класс символов, соответствующий одному из * или #

    импорт ре str = "10S # 9D7T *" rex = re.compile (r '\ d {1,2} [A-Z] [* #]?') печать (rex.findall (ул))

Результат

['10S#', '9D', '7T*']

Regex demo | Python demo

0 голосов
/ 15 января 2019

Вы можете получить три результата, сделав класс [*#] необязательным. (Также обратите внимание, что эти символы не нужно экранировать.)

str = '10S#9D7T*'
rex = re.compile(r'\d?\d\w?[*#]?')
print(rex.findall(str))

Результат: ['10S#', '9D', '7T*']

Что касается вашего второго правила: «И следовать за одним символом всегда находится», вы, вероятно, захотите сделать \w необязательным, удалив ? сразу после него.

r'\d?\d\w[*#]?'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...