#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}
— от двух до пяти прописных букв или цифр ASCIIb
— граница слова.
Смотрите демонстрацию 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])$