【问题标题】:clarification of Python regular expressionPython正则表达式的澄清
【发布时间】:2014-01-24 05:45:37
【问题描述】:

我对正则表达式和sub 在 Python 中的工作方式有点困惑。 我有这个例子:

nw = "  textttt    "
nw = re.sub(r'\s+(textttt)\s+', r'\1 ', nw)

nw 中的值将是 nw = "textttt "。 但是,如果我有:

nw = "  textttt    "
nw = re.sub(r'\s(textttt)\s', r'\1 ', nw)

nw 的值将是 nw = " textttt "。 有人可以解释第一个和第二个结果是如何产生的以及为什么它们不同吗?

【问题讨论】:

  • 除了在正则表达式中使用修饰符之外,您的正则表达式完全按预期工作。
  • 您能否解释一下为什么要从nw 中删除空格?
  • 我不确定这里有什么困惑。在第一种情况下,该模式匹配textttt 周围的所有空格,替换是后跟一个空格的反向引用。在第二种情况下,该模式匹配指定文本之前和之后的单个空格并相应地替换。
  • \s 后面的+ 匹配一个或多个空格。这具有匹配“textttt”之前和之后的所有空格的效果,但由于\s 不在捕获组中,因此在替换之后它就消失了。

标签: regex python-3.x


【解决方案1】:

为了清楚起见,让我们用数字替换空格:

import re
nw = "01textttt2345"

xx = re.sub(r'\d+(textttt)\d+', r'\1 ', nw)
print '[%s]' % xx  # [textttt ]

xx = re.sub(r'\d(textttt)\d', r'\1 ', nw)
print '[%s]' % xx  # [0textttt 345]

第一个表达式找到01textttt2345 并将其替换为组的值(=textttt) 加上一个空格。第二个只找到1textttt2 并将其替换为textttt,而字符串的其余部分保持不变。

【讨论】:

  • 谢谢,这是一个很好的回答和澄清。
【解决方案2】:
\\s - works for single whitespace character
\\s+ - works for sequence of one or more whitespace characters.

【讨论】:

  • 谢谢,但是空格被删除了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多