2

Я хочу извлечь буквы и цифры из строки.

Я попробовал это:

>>> re.findall(r'[a-z]|\d*','a11b4')
['a', '11', 'b', '4', '']
>>> re.findall(r'\d*|[a-z]','a11b4')
['', '11', '', '4', '']

Почему изменение порядка альтернатив в регулярных выражениях меняет вывод?

1 ответ1

2

Это потому что вы используете \d с * .

Когда у вас есть [a-z]|\d* , он сначала попытается найти совпадение с a-z . Если нет, он будет пытаться сопоставить 0 или более повторений цифры. В вашем примере, это будет соответствовать первому.

Однако, наоборот, сначала он попытается сопоставить 0 или более повторений цифры. Ну, a это 0 повторений цифры, так что это квалифицируется как «совпадение». Он не будет пытаться оценить выражение [a-z] , так как он уже квалифицирован для 0 повторений.

Чтобы правильно использовать этот шаблон (особенно если он должен быть буквой или хотя бы одной цифрой), вы можете вместо этого использовать:

[a-z]|\d+ или \d+|[a-z]

Это будет искать 1 или более повторений цифры, не найдет совпадения на a , а затем оценит [a-z] , что приведет к ожидаемому ответу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .