Регулярное выражение python, чтобы найти буквенно-цифровую строку хотя бы с одной буквой

Я пытаюсь выяснить синтаксис регулярного выражения, которое соответствовало бы 4 буквенно-цифровым символам, где есть хотя бы одна буква. Каждый должен быть заключен в: > и <, но я бы не хотел возвращать угловые скобки.

Например, при использовании re.findall в строке >ABCD<>1234<>ABC1<>ABC2 он должен вернуть ['ABCD', 'ABC1'].

1234 - без буквы

ABC2 - без угловых скоб

И какое ваше регулярное выражение вы сделали: /?

Black Thunder 13.09.2018 16:19
(?i)>((?=\d*[a-z])[a-z\d]{4})< должен работать на вас
anubhava 13.09.2018 16:21

Часть, с которой у меня проблема, - это «хотя бы одна буква» и «не возвращаются скобки». Без этих двух требований это довольно просто: r'(>[A-Z0-9]{4}<)' Я не уверен, что это вообще возможно с регулярным выражением, не так ли?

MJB 13.09.2018 16:24

Вы говорите, что хотите сопоставить ['ABCD', 'ABC4'] из вашей примерной строки. Но в вашем примере строка не содержит «ABC4». Это опечатка? Если нет, просьба подробнее рассказать о задействованной бизнес-логике.

Kevin 13.09.2018 16:26

@Kevin - извините за опечатку, я отредактировал пост, чтобы исправить

MJB 13.09.2018 16:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
2 617
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать это регулярное выражение на основе опережающего просмотра в Python с findall:

(?i)>((?=\d*[a-z])[a-z\d]{4})<

Демо RegEx

Код:

>>> regex = re.compile(r">((?=\d*[a-z])[a-z\d]{4})<", re.I)
>>> s = ">ABCD<>1234<>ABC1<>ABC2"
>>> print (regex.findall(s))
['ABCD', 'ABC1']

Детали RegEx:

  • re.I: включить модификатор игнорирования регистра
  • >: соответствует буквальному символу >
  • (: Начать группу захвата
    • (?=\d*[a-z]): посмотрите вперед, чтобы убедиться, что у нас есть хотя бы одна буква после 0 или более цифр
    • [a-z\d]{4}: соответствие 4 буквенно-цифровых символов
  • ): Конечная группа захвата
  • <: соответствует буквальному символу <

не было бы лучше скомпилировать регулярное выражение и добавить инказитивный флаг в качестве второго аргумента вместо того, чтобы делать строку регулярного выражения длиннее?

Yannic Hamann 13.09.2018 16:33

Работал как шарм! Не могли бы вы уточнить синтаксис?

MJB 13.09.2018 16:33

@YannicHamann: Хорошая идея, добавили re.compile в код.

anubhava 13.09.2018 16:35

@MJB: Я добавил подробное объяснение регулярного выражения в свой ответ. Дайте мне знать, какая часть не ясна, и я добавлю больше деталей.

anubhava 13.09.2018 16:35

@MJB: нажмите на демонстрацию и прочтите правую сторону. У него более подробное объяснение. Затем прочтите документы по регулярным выражениям, чтобы узнать, что не имеет смысла. Ключевым моментом здесь является утверждение опережения (?=\d*[a-z]) (опережающее утверждение начинается с ?=). Он что-то утверждает о следующих персонажах, не поглощая их.

Steven Rumbalski 13.09.2018 16:35

Спасибо @StevenRumbalski за то, что поправил меня. Мне нужно сейчас проверить глаза :)

anubhava 13.09.2018 16:41
import re
sentence = ">ABCD<>1234<>ABC1<>ABC2"
pattern = "\>((?=[a-zA-Z])(.){4})\<"
m = [m[0] for m in re.findall(pattern, sentence)]
#outputs ['ABCD', 'ABC1']

Некоторое объяснение может быть полезно здесь

Moti Korets 13.09.2018 20:35

Другие вопросы по теме