正则表达式去除字符串空格

时间:2016-01-25 20:13:07

标签: python regex strip

我需要在不使用stripjoinsplit方法的情况下从字符串的开头和结尾删除空格。

我搜索了很多类似的问题,并找到了类似的答案如下。

我无法理解的是' |'运算符用于匹配A | B的A或B,但在此处,它用作'和'运营商。

我想学习的是这种用法对于|是正常的运营商或它在这里有另一个功能!

为了让它更清晰一点,我已将空格替换为' xxx'

>>> pattern = re.compile(r'^\s+|\s+$')
>>> mo = re.sub(pattern,'xxx','   life is beautiful   ')
>>> mo
'xxxlife is beautifulxxx'

3 个答案:

答案 0 :(得分:2)

要理解的是,给定的模式将在输入字符串中多次匹配。 对于每个可能的匹配,它将决定是否具有前导或尾随空格。 总而言之,它会考虑两者;前导和尾随空格。

这可能是引起混淆的地方。

关于示例

的说明

为了澄清这一点,让我们看一下 re.sub Method Documentation

的文档

re.sub(pattern, repl, string, count=0, flags=0)

  

可选参数count是要替换的模式最大出现次数; count必须是非负整数。如果省略或为零,则将替换所有出现的事件。模式的空匹配仅在不与上一个匹配项相邻时替换,因此sub(' x *',' - ',' abc')将返回' -abc - '

count设置为1,可以更轻松地描述sub方法中的实际内容。请看下面的代码:

>>> pattern = re.compile(r'^\s+|\s+$')
>>> mo0 = '   life is beautiful   '
>>> mo1 = re.sub(pattern, 'xxx', mo0, 1)
>>> mo2 = re.sub(pattern, 'xxx', mo1, 1)
>>> mo0
'   life is beautiful   '
>>> mo1
'xxxlife is beautiful   '
>>> mo2
'xxxlife is beautifulxxx'

此处sub方法只替换匹配模式的单个匹配项。在这种情况下,mo0被处理,结果被放入mo1,其中给定的模式只被替换一次 - 更准确地匹配前导空格。然后以相同的方式处理mo1,并将结果放入mo2,其中给定的模式仅再次替换 - 更精确地匹配尾随空格。 m2最终与开头示例中先前定义的mo的结果相同。所以最后mo等于两者的字符串;前导和尾随空格的处理方式与mo2相同。虽然,在每个步骤中,选择要匹配的模式的哪一部分是使用逻辑OR完成的。

技术解释较少

我可能还有另一个线索,为什么这会让人感到困惑。让我们仔细看看And/Or Wikipedia article

  

和/或(也和/或)是一种语法结合,用于表示可能发生一个或多个连接的情况。 例如,句子"他将吃蛋糕,馅饼和/或布朗尼蛋糕"表示尽管该人可以吃三种列出的甜点中的任何一种,但这些选择并不是唯一的;这个人可能会吃掉一个,两个或所有三个选择。

因此,相信维基百科和我自己与人们的经历会让我得出结论,在使用和/或进行非正式交流时,并不总是清楚准确的含义是什么。在像数学这样的科学正式世界中,很明显OR必须具有什么意义。因此,维基百科进一步表示:

  

它用于描述精确的"或"在逻辑和数学中,而在"或"用口语表示包容性或排他性或。

一些法律文本的作者通过从法律文本中放弃这些含糊不清的驱动因素来定义最佳实践(e.g. here)。

然而,维基百科进一步指出:

  

和/或自19世纪中期以来一直用于官方,法律和商业文件,并且在20世纪出现了更广泛使用的证据。

这告诉我它似乎在增长,即使在精确的环境中不鼓励使用它。

总结

我猜这个陈述的背景并不清楚。如果将一个匹配中的上下文带入句子中,就不会有任何混淆的空间。

答案 1 :(得分:0)

r'^\s+|\s+$'sub()一起使用时,它正在 OR 模式下工作。

它说:在字符串开头匹配空格(^)或字符串末尾的空格($

sub()将替换所有匹配。

答案 2 :(得分:0)

正在查找'^\s+'(字符串的开头,一个或多个空格)或'\s+$'(一个或多个空格,字符串结尾)并用'xxx'替换匹配项的实例。它在传递的字符串的开头找到前者,替换它。然后它在最后找到后者,并替换它。