Регулярное выражение для получения строковых частей в скобках, разделенных запятыми - PullRequest
1 голос
/ 20 февраля 2020

У меня есть строка, из которой я хочу взять значения в скобках. Затем получите значения, которые отделены от запятой.

Пример: x (142,1,23ERWA31)

Я хотел бы получить:

  • 142
  • 1
  • 23ERWA31

Можно ли получить все с одним регулярным выражением?

Я нашел способ сделать это, но это уродливо.

Вот как я это сделал в python:

import re
string = "x(142,1,23ERWA31)"
firstResult = re.search("\((.*?)\)", string)
secondResult = re.search("(?<=\()(.*?)(?=\))", firstResult.group(0))
finalResult = [x.strip() for x in secondResult.group(0).split(',')]
for i in finalResult:
    print(i)

142

1

23ERWA31

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Это работает для вашего примера строки:

import re

string = "x(142,1,23ERWA31)"
l = re.findall (r'([^(,)]+)(?!.*\()', string)

print (l)

Результат: простой список

['142', '1', '23ERWA31']

Выражение соответствует последовательности символов не в (, ,, ) и - для предотвращения подбора первого x - не может быть , за которым следует и ( в любом месте строки. Это также работает, если ваша преамбула x состоит из более чем одного символа.

findall вместо search гарантирует, что все элементы найдены, и в качестве бонуса возвращает простой список результаты.

1 голос
/ 20 февраля 2020

Немного странно выглядит, а также при условии, что в скобках всегда будет группа из 3 значений - но попробуйте это регулярное выражение

\((.*?),(.*?),(.*?)\)

Чтобы извлечь все совпадения группы в один объект - ваш код будет выглядеть как

import re
string = "x(142,1,23ERWA31)"
firstResult = re.search("\((.*?),(.*?),(.*?)\)", string).groups()

Вы можете затем вызвать объект firstResult как список

>> print(firstResult[2])
23ERWA31
1 голос
/ 20 февраля 2020

Вы можете сделать это намного проще. Вы запускаете свой первый Regex, но затем не получаете результат. Вы хотите .group(1) (inside the brackets), а не .group(0) (the whole match). Если у вас есть это, вы можете просто разделить его на ,:

import re

string = "x(142,1,23ERWA31)"
firstResult = re.search("\((.*?)\)", string)

for e in firstResult.group(1).split(','):
    print(e)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...