如何使用不以白色 space 结尾但可能在捕获组之后有白色 space 的捕获组来子字符串?
How to sub a string with a capturing group that does not end with white space but might have white space after the capturing group?
我正在尝试将看起来像 ( self, False )
的字符串替换为 (self, False)
。我使用的正则表达式:
s = re.compile('\(\s*(.*)\s*\)')
s.sub(r'()', '( self, False )')
哪个returns(self, False )
如何捕获括号内没有尾随空格的组?
为什么不使用字符串替换来去除空字符中的空格
str = '( self, False )'
print(str.replace(' ',''))
#(self,False)
试试这个:
#TEST 1
>>> import re
>>> str = '( self, False )'
>>> re.sub(r'(\()([\s]*?)((?:[\S]+?[\s]*?(?!\))+[\S]*?)|(?:[\S]+?(?=[\s]*?\))))([\s]*?)(\))', r'', str)
#OUTPUT
'(self, False)'
#TEST 2
>>> 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'', 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
>>> '''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'', 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)
利用您的简单解决方案:
>>> '''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'', 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)
找到一个简单的解决方案。
s = re.compile('\(\s*(.*?)\s*\)')
s.sub(r'()', 'hi hello ble ble ( self, False ) ( self ) (self , greedy ) ( hello)')
#Output
'hi hello ble ble (self, False) (self) (self , greedy) (hello)'
根据 python 重新文档:
The '', '+', and '?' qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; if the RE <.> is matched against ' b ', it will match the entire string, and not just ''. Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using the RE <.*?> will match only ''.
我正在尝试将看起来像 ( self, False )
的字符串替换为 (self, False)
。我使用的正则表达式:
s = re.compile('\(\s*(.*)\s*\)')
s.sub(r'()', '( self, False )')
哪个returns(self, False )
如何捕获括号内没有尾随空格的组?
为什么不使用字符串替换来去除空字符中的空格
str = '( self, False )'
print(str.replace(' ',''))
#(self,False)
试试这个:
#TEST 1
>>> import re
>>> str = '( self, False )'
>>> re.sub(r'(\()([\s]*?)((?:[\S]+?[\s]*?(?!\))+[\S]*?)|(?:[\S]+?(?=[\s]*?\))))([\s]*?)(\))', r'', str)
#OUTPUT
'(self, False)'
#TEST 2
>>> 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'', 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
>>> '''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'', 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)
利用您的简单解决方案:
>>> '''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'', 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)
找到一个简单的解决方案。
s = re.compile('\(\s*(.*?)\s*\)')
s.sub(r'()', 'hi hello ble ble ( self, False ) ( self ) (self , greedy ) ( hello)')
#Output
'hi hello ble ble (self, False) (self) (self , greedy) (hello)'
根据 python 重新文档:
The '', '+', and '?' qualifiers are all greedy; they match as much text as possible. Sometimes this behaviour isn’t desired; if the RE <.> is matched against ' b ', it will match the entire string, and not just ''. Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched. Using the RE <.*?> will match only ''.