【问题标题】: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?如何使用不以空格结尾但在捕获组之后可能有空格的捕获组子字符串?
【发布时间】:2019-08-31 09:22:29
【问题描述】:

我正在尝试将类似于 ( self, False ) 的字符串替换为 (self, False)。我正在使用的正则表达式:

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

返回(self, False )

如何捕获括号内没有尾随空格的组?

【问题讨论】:

标签: python python-3.x regex re


【解决方案1】:

为什么不使用字符串替换来消除带有空字符的空格

str = '(    self, False   )'
print(str.replace(' ',''))
#(self,False)

【讨论】:

  • 我在一大段文本上运行脚本,我只想在开头和右括号之前去掉多余的空格。我不想替换文本中的所有空格。
  • 想知道他是否想保持两者之间的空间,哈哈。很好的答案
  • 您的预期输出在问题中显示(self,False),它没有空格。
  • @DeveshKumarSingh 你的方向有点不清楚,但我在下面发布了一个解决方案
  • @DeveshKumarSingh 哦,我的错,输入输出错误,应该是 (self, False)。基本上它在括号之间捕获的任何内容。编辑了我的问题。
【解决方案2】:

找到了一个简单的解决方案。

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文档:

”、“+”和“?”限定符都是贪婪的;它们匹配尽可能多的文本。有时这种行为是不需要的;如果 RE <.>> 与 'b' 匹配,它将匹配整个字符串,而不仅仅是 ''。添加 ?在预选赛使其以非贪婪或最低限度的方式执行比赛之后;将匹配尽可能少的字符。使用 RE <.> 将仅匹配 ''。

【讨论】:

  • 绝对。取消选择我的答案并使用它。
【解决方案3】:

试试这个:

#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
>>> 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
>>> '''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)

捎带你的简单解决方案:

>>> '''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)

【讨论】:

  • OP 输出在问题中显示(self,False),它没有空格。
  • @Nishat。我用考虑周围文本的第二个版本更新了它
  • 进行了最后一次测试,以便处理单个术语
  • 最终的组合解决方案非常简洁。
猜你喜欢
  • 1970-01-01
  • 2016-05-29
  • 2013-09-30
  • 2017-03-11
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多