я використовую
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"]