Как передать строку группе захвата, которая не заканчивается пробелом, но может иметь пробел после группы захвата с использованием регулярного выражения Python? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь заменить строку, которая выглядит следующим образом ( self, False ) на (self, False). Я использую регулярное выражение:

s = re.compile('\(\s*(.*)\s*\)')
s.sub(r'(\1)', '(    self, False   )')

Что возвращает (self, False )

Как мне записать группу в круглые скобки без пробелов?

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

Отмените выбор Это ваше более простое решение

Попробуйте это

РЕДАКТИРОВАТЬ: ОБНОВЛЕНО На основании того, что вы это сказалипоявляется в тексте

РЕДАКТИРОВАТЬ 2: ОБНОВЛЕНО Для, если в скобках указан один термин

#TEST 1
>>> import re

>>> str = '(    self, False   )'

>>> re.sub(r'(\()([\s]*?)((?:[\S]+?[\s]*?(?!\))+[\S]*?)|(?:[\S]+?(?=[\s]*?\))))([\s]*?)(\))', r'\1\3\5', str)

#OUTPUT
'(self, False)'






#TEST 2
>>> import re


>>> str = '''TEbh eyendd dkdkmfkf(    self, False   ) dduddnudmd (    self, False   )
(    self, False   ) fififfj m(    self, False   )kmiff ikifkifko kfmimfimfifi k
fkmfikfk kfmifm (    self, False   ) fififi,fo'''


>>> print(re.sub(r'(\()([\s]*?)((?:[\S]+?[\s]*?(?!\))+[\S]*?)|(?:[\S]+?(?=[\s]*?\))))([\s]*?)(\))', r'\1\3\5', str))


#OUTPUT
'TEbh eyendd dkdkmfkf(self, False) dduddnudmd (self, False)
(self, False) fififfj m(self, False)kmiff ikifkifko kfmimfimfifi k
fkmfikfk kfmifm (self, False) fififi,fo'






#TEST 3
>>> import re


>>> '''TEbh eyendd dkdkmfkf(    self) dduddnudmd (    self)
(    self, False   ) fififfj m(    self, False)kmiff ikifkifko kfmimfimfifi k
fkmfikfk kfmifm (    self, False   ) fififi,fo
(self   ) dndnd (self   ) fufufjiri (    self   ) (self   ) (    self)(    self)(self   )(    self   )(self   )(    self   )'''


>>>  print(re.sub(r'(\()([\s]*?)((?:[\S]+?[\s]*?(?!\))+[\S]*?)|(?:[\S]+?(?=[\s]*?\))))([\s]*?)(\))', r'\1\3\5', str))


#OUTPUT
TEbh eyendd dkdkmfkf(self) dduddnudmd (self)
(self, False) fififfj m(self, False)kmiff ikifkifko kfmimfimfifi k
fkmfikfk kfmifm (self, False) fififi,fo
(self) dndnd (self) fufufjiri (self) (self) (self)(self)(self)(self)(self)(self)

.

.

Использование вашего простого решения

>>> import re


>>> '''TEbh eyendd dkdkmfkf(    self) dduddnudmd (    self)
(    self, False   ) fififfj m(    self, False)kmiff ikifkifko kfmimfimfifi k
fkmfikfk kfmifm (    self, False   ) fififi,fo
(self   ) dndnd (self   ) fufufjiri (    self   ) (self   ) (    self)(    self)(self   )(    self   )(self   )(    self   )'''


>>> print(re.sub(r'(\()\s*([\S\s]*?)\s*(\))', r'\1\2\3', str))


#OUTPUT
TEbh eyendd dkdkmfkf(self) dduddnudmd (self)
(self, False) fififfj m(self, False)kmiff ikifkifko kfmimfimfifi k
fkmfikfk kfmifm (self, False) fififi,fo
(self) dndnd (self) fufufjiri (self) (self) (self)(self)(self)(self)(self)(self)
1 голос
/ 10 апреля 2019

Нашли простое решение.

s = re.compile('\(\s*(.*?)\s*\)')
s.sub(r'(\1)', 'hi hello ble ble ( self, False   ) ( self      ) (self , greedy    ) (    hello)')
#Output
'hi hello ble ble (self, False) (self) (self , greedy) (hello)'

Согласно документации Python:

'', '+' и '?'все квалификаторы жадные;они соответствуют как можно большему количеству текста.Иногда такое поведение нежелательно;если RE <. </em>> сопоставлено с 'b', оно будет соответствовать всей строке, а не только ''.Добавление?после того, как квалификатор заставляет его провести матч не жадным или минимальным образом;будет найдено как можно меньше символов.Использование RE <. *?> Будет соответствовать только ''.

1 голос
/ 10 апреля 2019

Почему бы не использовать замену строки, чтобы избавиться от пробелов с пустыми символами

str = '(    self, False   )'
print(str.replace(' ',''))
#(self,False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...