У меня есть два регулярных выражения: одно совпадение для всех символов [az]
и другое, исключая следующую комбинацию символов [^spuz(ih)]
(символы s, p, u, z, ih
), как бы объединить эти два что я могу разрешить все буквенно-цифровые символы, кроме тех, которые указаны во втором RE?
(re.match(r'^[a-z]*(?![spuz]|ih)[a-z]s$', insert_phrase)
Вы не можете "комбинировать" их как таковые, но вы можете написать другое регулярное выражение, которое имеет такой же эффект. Для этого вы можете использовать конструкцию (?!). Он соответствует 0 символам, только если регулярное выражение в нем не соответствует следующей части. Таким образом, вы можете использовать:
'(?![spuz(ih)])[a-z]'
Или, поскольку это было не то, что вы хотели, измените его на:
'(?![spuz]|ih)[a-z]'
В измененном вопросе вам кажется, что вместо этого вы видите отрицательный lookbehind. Это превращает шаблон в:
'^[a-z]*(?<![a-z][spuz]|ih)s$'
Обратите внимание на дополнительную [az] в части lookbehind. Это необходимо, потому что выражения lookbehind должны быть фиксированной шириной. Это означает, что строка, подобная "ps", будет соответствовать шаблону, но вы этого не хотите. Поэтому вместо этого лучше использовать два отдельных lookbehinds (оба из которых должны быть истинными для соответствия строки):
'^[a-z]*(?<![spuz])(?<!ih)s$'
[^spuz(ih)]
не соответствует тому, что вы думаете, что он соответствует. Вы не можете захватить группу в классе персонажей. Таким образом, это исключает: -s, p, u, z, (, i, h, )