2011-08-25 93 views
-1

如何使用python3和re.sub()替换一个字中间的连字符?正则表达式替换字符中间的连字符

“-ICE-洁面乳 - 挂出” - > “-ICE洁面乳 - 挂出”

感谢,

巴里

编辑:我试过

self.lines = re.sub(r'\w(-)\w', " ", self.lines)
,但没有确定如何继续。我喜欢/ b的做法。

+3

你试过了什么? – agf

回答

4

re.sub(pattern, repl, string[, count, flags])看到docs.python.org

你的模式将是r'\b-\b'

看到这个模式here on Regexr

并与(' '

正则表达式的字符串前r deifnes原始空间替换此字符串,这意味着你不需要双重转义。

\b是一个字的边界,这意味着它会匹配一个-当前有一个字符字符。

+1

@agf我不确定哪个子代替。但是正则表达式部分将匹配由单词字符包围的连字符而不是空白。连字符是非单词字符,而空白字符是非单词字符,因此无法匹配字边界。 – stema

+0

@agf:你非常错误。 '\ b- \ b'匹配任何一侧包围“单词”字符的单个HYPHEN-MINUS。 **你完全不知道'\ b'做了什么!**'\ b'和'(?:(?<= \ w)(?!\ w)|(?<!\ w) )(?= \ w)的)'。请仔细阅读,直到你明白它在做什么为止! – tchrist

+0

是的,那是错的,我在想'_',所以任何一方的字母都不会是一个字的边界,我的不好。 – agf

1
>>> re.sub(r'(\w)-(\w)', lambda m: '%s %s' % (m.groups()), '-ice-cream- hang-out') 
'-ice cream- hang out' 
+0

没有必要匹配字词。 '\ b'断言就足够了。记住它意味着'(?:(?<= \ w)(?!\ w)|(?<!\ w)(?= \ w))'。 – tchrist