/ / Використання регулярного виразу для розбиття рядка в python - python, regex

використовуючи регулярний вираз, щоб розділити рядок в python - python, regex

я використовую

re.compile(r"(.+?)1+").findall("44442(2)2(2)44")

може отримати

["4","2(2)","4"]

, але як я можу отримати

["4444","2(2)2(2)","44"]

за допомогою регулярного виразу?

Дякую

Відповіді:

4 для відповіді № 1

Необхідно змінити ваш малюнок. Просто потрібно використовувати правильну функцію для роботи. re.findall поверне список груп, якщо у шаблоні є групи захоплення. Щоб отримати весь матч, скористайтеся переінфрактор замість того, щоб ви могли витягніть повний матч від кожного фактичного об'єкта відповідності.

pattern = re.compile(r"(.+?)1+")
[match.group(0) for match in pattern.finditer("44442(2)2(2)44")]

3 для відповіді № 2

З мінімальними змінами регулярного виразу OP:

[m[0] for m in re.compile(r"((.+?)2+)").findall("44442(2)2(2)44")]

findall дасть вам повний матч, якщо немає груп або груп, якщо є деякі. Отже, дано, що ти треба групи для вашого регулярного виразу для роботи, ми просто додаємо іншу групу, яка охоплює повний відповідність, і потім витягуємо її.


0 для відповіді № 3

Ви можете зробити:

[i[0] for i in re.findall(r"((d)(?:[()]*2*[()]*)*)", s)]

Тут регулярний вираз:

((d)(?:[()]*2*[()]*)*)

який буде виводити список кортежів, що містять дві захоплені групи, і ми маємо лише інтерес до першого, отже i[0].

Приклад:

In [15]: s
Out[15]: "44442(2)2(2)44"

In [16]: [i[0] for i in re.findall(r"((d)(?:[()]*2*[()]*)*)", s)]
Out[16]: ["4444", "2(2)2(2)", "44"]