Ваше регулярное выражение говорит: «Найдите любого из символов -.:alnum
, затем запишите любое количество любых символов в первую группу захвата».
В первом тесте было найдено -
дляпервый персонаж, затем захваченный mystr
в первой группе захвата.Если в регулярном выражении есть какие-либо группы, findall
возвращает список найденных групп, а не совпадений, поэтому соответствующее -
не включается.
Ваш второй тест обнаружил u
как один из -.:alnum
символов (поскольку ни один из qwerty
не соответствует ни одному), затем захватывается и возвращает остаток после него, io
.
Как отмечает @revo в комментариях, [....]
- это класс символов, соответствующий любомухарактер в этом.Чтобы включить в него класс символов POSIX (например, [:alnum:]
), вам нужно два набора скобок.Кроме того, нет порядка в классе персонажа;тот факт, что вы включили в него -
, означает, что это будет один из сопоставляемых символов, , а не , что буквенно-цифровые символы будут сопоставлены без него.Наконец, если вы хотите сопоставить любое количество буквенно-цифровых символов, у вас есть квантификатор *
на неправильной вещи.
Таким образом, "соответствует -
, тогда любое количество буквенно-цифровых символов" будет равно -([[:alnum:]]*)
, кроме ... Python не поддерживает классы символов POSIX .Таким образом, вы должны написать свое собственное: -([A-Za-z0-9]*)
.
Однако, это не будет соответствовать вашей строке, потому что промежуточный пробел, как вы заметили, не буквенно-цифровой символ.Чтобы учесть это, -\s*([A-Za-z0-9]*)
.