【发布时间】:2009-08-28 12:54:44
【问题描述】:
用空格替换每次出现的前导或尾随连字符的最佳方法是什么?
例如,我想要
---ab---c-def--
成为
000ab---c-def00 (零是空格)
我正在尝试在 Python 中执行此操作,但我似乎无法想出一个可以进行替换的正则表达式。我想知道是否有另一种更好的方法来做到这一点?
【问题讨论】:
用空格替换每次出现的前导或尾随连字符的最佳方法是什么?
例如,我想要
---ab---c-def--
成为
000ab---c-def00 (零是空格)
我正在尝试在 Python 中执行此操作,但我似乎无法想出一个可以进行替换的正则表达式。我想知道是否有另一种更好的方法来做到这一点?
【问题讨论】:
re.sub(r'^-+|-+$', lambda m: ' '*len(m.group()), '---ab---c-def--')
说明:模式匹配 1 个或多个前导或尾随破折号;替换最好由可调用执行,它接收每个匹配对象 - 所以 m.group() 是匹配的子字符串 - 并返回必须替换它的字符串(与所述子字符串中的字符一样多的空格,在这个案例)。
【讨论】:
使用可调用对象作为替换目标:
s = re.sub("^(-+)", lambda m: " " * (m.end() - m.start()), s)
s = re.sub("(-+)$", lambda m: " " * (m.end() - m.start()), s)
【讨论】:
当你想匹配一个字符串的末尾时,一定要仔细考虑你需要$还是\Z。示例,为清楚起见,使用 '0' 而不是 ' ':
>>> re.sub(r"^-+|-+\Z", lambda m: '0'*len(m.group()), "--ab--c-def--")
'00ab--c-def00'
>>> re.sub(r"^-+|-+\Z", lambda m: '0'*len(m.group()), "--ab--c-def--\n")
'00ab--c-def--\n'
>>> re.sub(r"^-+|-+$", lambda m: '0'*len(m.group()), "--ab--c-def--\n")
'00ab--c-def00\n'
>>>
【讨论】: