Python регулярное выражение для совпадения пробела или открытых скобок - PullRequest
1 голос
/ 13 января 2020

В более крупном тексте моя цель состоит в том, чтобы извлечь с помощью регулярных выражений следующее:

  1. известную комбинацию цифр и букв (буква может быть в верхнем или нижнем регистре)
  2. эта комбинация может сопровождаться пробелом или открывающей скобкой, за которой следует число или буква.

например: пример текста:

бла-бла-бла-бла 123K бла-бла-бла 123k бла-бла-123K (1) (e) 123k (z) (1)

требуемый результат:

  • 123K, 123k, 123K (1) (e) , 123k (z) (1)

Я пробовал следующее:

[ ]+123(K|k)+[ ]

, который работает для 123K и 123k

, однако для скобок я пробовал (что не работает):

[ ]+123(K|k)+([ ]|(?<=\().*?(?=\),))

приветствуются любые рекомендации по решению этой проблемы.

Я использую Python 3,6

РЕДАКТИРОВАТЬ: Мне удалось отредактировать свое регулярное выражение в соответствии с круглыми скобками после "K | k", обновленное регулярное выражение:

[ ]+123(K|k)+([ ]|\(\w\))

Ответы [ 3 ]

0 голосов
/ 13 января 2020

Я устанавливаю предел поиска для последовательных открывающих и закрывающих скобок от 0 до 2 после 123 (k | K) в зависимости от вашего примера.

Код

import re
m = re.findall('(123(k|K)(\(.\)){0,2})', 'blah blah blah 123K blah blah 123k blah blah 123K(1)(e) 123k(z)(1)')

result = [i[0] for i in m]

Результат

['123K', '123k', '123K(1)(e)', '123k(z)(1)']
0 голосов
/ 13 января 2020

Чтобы получить желаемые совпадения, вы можете использовать класс символов для совпадения прописных или строчных букв k, например [Kk], или использовать re.IGNORECASE.

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

Чтобы сопоставить любые вхождения открывающей и закрывающей скобки с одним символом слова между ними, вы можете зафиксировать совпадение в группе и повторить группу 0 или более раз.

\b123[Kk](?:\(\w\))*

Пояснение

  • \b123 Совпадение 123, которому предшествует граница слова, чтобы оно не входило в большее слово
  • [Kk] Соответствует верхнему или нижнему регистру k
  • (?: Группа без захвата
    • \(\w\) Соответствует символу слова в скобках
  • )* Закрыть группировать и повторять 0+ раз

Regex demo

Пример кода

import re
regex = r"\b123k(?:\(\w\))*"
s = "blah blah blah 123K blah blah 123k blah blah 123K(1)(e) 123k(z)(1)"
print(re.findall(regex, s, re.IGNORECASE))

Выход

['123K', '123k', '123K(1)(e)', '123k(z)(1)']
0 голосов
/ 13 января 2020

Я полагаю, это приближается к тому, что вы хотите?

123(k|K)(\([0-9a-zA-Z]?\)){0,2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...