Python re.sub在引号内删除空格

时间:2017-08-19 16:24:16

标签: python regex

我问的是Python Regular expression must strip whitespace except between quotes

的反面

我想使用re.sub从嵌入在较大字符串中的单引号字符串中删除前导和尾随空格。如果我有,比方说,

textin  = " foo '  bar nox ': glop ,' frox ' "

我想制作

desired = " foo 'bar nox': glop ,'frox' "

删除前导空格相对简单。

>>> lstripped = re.sub(r"'\s*([^']*')", r"'\1", textin)    
>>> lstripped
" foo 'bar nox ': glop ,'frox ' "

问题是删除尾随空格。我试过,例如,

>>> rstripped = re.sub(r"('[^']*)(\s*')", r"\1'", lstripped)
>>> rstripped
" foo 'bar nox ': glop ,'frox ' "

但由于[^']*与尾随空格匹配而失败。

我考虑过使用回溯模式,但Re doc说它们只能包含固定长度的模式。

我确信这是以前解决的问题,但我很难过。

谢谢!

编辑:解决方案需要处理包含单个非空白字符和空字符串的字符串,即' p ' --> 'p'' ' --> ''

3 个答案:

答案 0 :(得分:2)

a_letters - 贪婪,即它还包含空格和/或标签,所以让我们使用非贪婪的:[^\']*

[^\']*?

较少转义的版本:

In [66]: re.sub(r'\'\s*([^\']*?)\s*\'','\'\\1\'', textin)
Out[66]: " foo 'bar nox': glop ,'frox' "

答案 1 :(得分:2)

捕捉空白的方法是定义前一个 *非贪婪,而不是r"('[^']*)(\s*')"使用r"('[^']*?)(\s*')"

您还可以使用单个正则表达式捕获双方:

stripped = re.sub("'\s*([^']*?)\s*'", r"'\1'", textin)

答案 2 :(得分:0)

这似乎有效:

' # an apostrophe (\s*) # 0 or more white-space characters (leading white-space) (.*?) # 0 or more any character, lazily matched (keep) (\s*) # 0 or more white-space characters (trailing white-space) ' # an apostrophe

<Hub>
    <HubSection>
        <DataTemplate>

        </DataTemplate>
    </HubSection>
</Hub>

Demo