Регулярное выражение для сопоставления от 2 до 5 символов, один из которых должен быть алфавитным

#python-3.x #regex

#python-3.x #регулярное выражение

Вопрос:

Я не силен в регулярных выражениях, и следующее ставит меня в тупик.

Мне нужно найти все совпадения в строке, которые содержат только от 2 до 5 символов [A-Z0-9] и должны содержать хотя бы один алфавитный символ [A-Z]

Итак

 A1 - Match
AAA - Match
AAAAAA - No Match
A1234 - Match
123 - No Match
A123A - Match
A - No Match
1 - No Match
A1B2C3 - No Match
 

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

 ([A-Z0-9]*[A-Z][A-Z0-9]*){2,5}
 

Но это не ограничивает общую длину совпадения от 2 до 5 символов

Ответ №1:

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

 b(?=d*[A-Z])[A-Zd]{2,5}b
b(?=[A-Z0-9]{2,5}b)[A-Z0-9]*[A-Z][A-Z0-9]*b
 

Смотрите демонстрацию регулярных выражений # 1 и демонстрацию регулярных выражений # 2. Подробные сведения:

  • b — граница слова
  • (?=d*[A-Z]) — после нуля или более цифр должна быть прописная буква ASCII
  • (?=[A-Z0-9]{2,5}b) — должно быть от 2 до 5 символов alnum до границы слова
  • [A-Z0-9]* — ноль или более прописных букв или цифр ASCII
  • [A-Z] — прописная буква ASCII
  • [A-Zd]{2,5} — от двух до пяти прописных букв или цифр ASCII
  • b — граница слова.

Смотрите демонстрацию Python:

 import re
text = "A1 AAA....A1234!!!!~A123A abc,AAAAAA,123,A,1,A1B2C3"
print(re.findall(r'b(?=[A-Z0-9]{2,5}b)[A-Z0-9]*[A-Z][A-Z0-9]*b', text))
# => ['A1', 'AAA', 'A1234', 'A123A']
 

Комментарии:

1. Спасибо. Мне нужно найти несколько вхождений в строке, поэтому, если я использую ^ и $, указанное выше не будет работать. Если я удаляю их, это работает, но соответствует частичным частям строки. A1 AAA AAAAAA A1234 123 A123A A 1 A1B2C3 приводит к совпадению 1-го 5-го символа AAAAAA, когда я бы хотел, чтобы эта подстрока не совпадала

2. Исправлено @TheWelshDragon.

Ответ №2:

Попробуйте это ^([A-Z][A-Z0-9]{1,4}|[A-Z0-9][A-Z][A-Z0-9]{,3}|[A-Z0-9]{1,2}[A-Z][A-Z0-9]{,3}|[A-Z0-9][A-Z][A-Z0-9])$