Извлечение двух шаблонов одновременно с помощью регулярных выражений - PullRequest
0 голосов
/ 18 февраля 2019

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

"vw xy zz (X, Y, Z)"

Мой желаемый результат:

["vw xy zz", "X", "Y", "Z"]

Я знаю, как извлечь текст перед скобками:

import re
pattern = r"(^[^\(]+)"
text = "vw xy zz (X, Y, Z)"
re.findall(pattern, text)
# ['vw xy zz ']

Я также знаю, как извлечь текст между скобками:

pattern = r"\(.*\)"
text = "vw xy zz (X, Y, Z)"
re.findall(pattern, text)
# ['(X, Y, Z)']

Но мне интересно, есть лиспособ объединить шаблоны, чтобы получить желаемый результат одновременно.

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Вы можете использовать re.findall:

s = "vw xy zz (X, Y, Z)"
result = [i.strip() for i in re.findall('[\w\s]+', s)]

Выход:

['vw xy zz', 'X', 'Y', 'Z']
0 голосов
/ 18 февраля 2019

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

re.findall(r'[^(),\s](?:[^(),]*[^(),\s])?', s)

См. Регулярное выражение демо .

Нет необходимости strip() элементы после того, как re.findall возвращает все совпадения.

Детали

  • [^(),\s] - класс отрицанных символов , соответствующий любому символу, но (, ), , и пробелу
  • (?:[^(),]*[^(),\s])? - 1 или 0 вхождений:
    • [^(),]* - любые символы кроме (, ) и ,
    • [^(),\s] - любые символы, кроме (, ), , и пробелов
0 голосов
/ 18 февраля 2019

const regex = /([a-zA-Z]{1,2}\s?){3}|[A-Z]/g

const text = "vw xy zz (X, Y, Z)"
const res = text.match(regex);
console.log(res)

это регулярное выражение будет соответствовать: ["vw xy zz ", "X", "Y", "Z"]

вы можете проверить его здесь тестер регулярных выражений

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