用匹配组中的下划线替换空格字符?

时间:2017-04-19 21:31:25

标签: python regex

我有一个看起来像这样的字符串:

"(case when Campaign='Back to School' and VariableName='Total_FB_Spend' then VariableValue else 0 end) AS Back to School_Total_FB_Spend,(case when Campaign='Back to School' and VariableName='Total_FB_Imp' then VariableValue else 0 end) AS Back to School_Total_FB_Imp"

我想使用Python正则表达式在'end)AS'字符后删除列名中的空格。结果应该变成这样的

"(case when Campaign='Back to School' and VariableName='Total_FB_Spend' then VariableValue else 0 end) AS Back_to_School_Total_FB_Spend,(case when Campaign='Back to School' and VariableName='Total_FB_Imp' then VariableValue else 0 end) AS Back_to_School_Total_FB_Imp"

我能够在Python [example here]中使用正则表达式来匹配我感兴趣的那些部分但是我想知道如何优雅地(例如,一个衬里或以Pythonic方式)替换匹配的组中的空格字符

3 个答案:

答案 0 :(得分:1)

您需要一个带有lambda表达式的re.sub作为替换参数:

import re
s = "(case when Campaign='Back to School' and VariableName='Total_FB_Spend' then VariableValue else 0 end) AS Back to School_Total_FB_Spend,(case when Campaign='Back to School' and VariableName='Total_FB_Imp' then VariableValue else 0 end) AS Back to School_Total_FB_Imp"
pat = r'(end\) as )([^,]*)'
print(re.sub(pat, lambda m: "{}{}".format(m.group(1), m.group(2).replace(" ", "_")), s))

请参阅Python demo

请注意,我将(.*?(,|$))替换为效率更高的([^,]*),除,以外的任何零个或多个字符。现在,整个正则表达式匹配:

  • (end\) as ) - 第1组:end) as
  • ([^,]*) - 第2组:除,
  • 以外的任何零个或多个字符

然后,使用lambda m: "{}{}".format(m.group(1), m.group(2).replace(" ", "_")),将第一个捕获组的内容复制回结果不变,并使用.replace(" ", "_")修改第二个组内容。当然,如果可能有任何空格re.sub(r'\s+', '_', m.group(2)),您可以在其上运行另一个正则表达式。

答案 1 :(得分:1)

受@ Wiktor启发的另一个解决方案。

import re
s = "(case when Campaign='Back to School' and VariableName='Total_FB_Spend' then VariableValue else 0 end) AS Back to School_Total_FB_Spend,(case when Campaign='Back to School' and VariableName='Total_FB_Imp' then VariableValue else 0 end) AS Back to School_Total_FB_Imp"
pat = r'(?<=end\) as )[\w\s]*(?=,)'
print(re.sub(pat, lambda m: m.group(0).replace(" ", "_"), s, flags=re.IGNORECASE))

这里我们使用正则表达式的前瞻和lookbehind功能来匹配我们想要改变的子字符串。正则表达式将匹配任何序列的字符 [a-zA-Z0-9_]空格前面的end ) as,然后是,。主要区别在于匹配仅包含一个组。

答案 2 :(得分:0)

使用bytes.replace()功能。

'Back to School'.replace(' ', '_')