1

给定以下字符串:

"-local locally local test local."

我的目标是用“we”替换字符串“local”,这样结果就变成了

"-local locally we test local."

到目前为止(在 stackoverflow 的帮助下:Python:find exact match)我已经能够想出以下正则表达式:

variable='local'
re.sub(r'\b%s([\b\s])' %variable, r'we\1', "-local locally local test local.")

但是,这段代码有两个问题:

  1. 搜索通过减号,输出变为:

    '-we locally we test local.'
    

    它应该在哪里

    '-local locally we test local.'
    
  2. 搜索以减号开头的字符串,例如“-local”,搜索失败

4

4 回答 4

2

您可以使用空格作为分隔符将字符串分隔为子字符串。然后检查每个字符串,替换它是否与您要查找的内容匹配,然后重新组合它们。

当然效率不高:)

于 2012-10-25T20:47:24.623 回答
2

尝试以下操作:

re.sub(r'(^|\s)%s($|\s)' % re.escape(variable), r'\1we\2', some_string)

在另一个问题中建议的正则表达式有点奇怪,因为\b在字符类中意味着退格字符。

基本上你现在拥有的是一个正则表达式,它在开头搜索带有单词边界的目标字符串(从单词字符到非单词字符,反之亦然),最后是一个空白字符。

由于您不想匹配最终的“本地”,因为它后面跟着一个句点,我不认为单词边界是这里的方法,而是您应该寻找空格或字符串的开头/结尾,这是上面的正则表达式所做的。

我还在re.escape变量上使用过,这样如果您在目标字符串中包含一个字符,例如.$通常具有特殊含义的字符,它们将被转义并解释为文字字符。

例子:

>>> s = "-local locally local test local."
>>> variable = 'local'
>>> re.sub(r'(^|\s)%s($|\s)' % re.escape(variable), r'\1we\2', s)
'-local locally we test local.'
>>> variable = '-local'
>>> re.sub(r'(^|\s)%s($|\s)' % re.escape(variable), r'\1we\2', s)
'we locally local test local.'
于 2012-10-25T20:50:44.637 回答
1
sed 's/ local / we /g' filename

我不做python,但想法只是在模式中的local前后放一个空格来查找,并在替换中包含空格。

于 2012-10-25T20:50:48.863 回答
0

如果您只想替换由空格分隔的单词的所有出现,您可以拆分字符串并对结果列表进行操作:

search = "local"
replace = "we"
s = "-local locally local test local."
result = ' '.join([x if not x == search else replace for x in s.split(" ")])
于 2012-10-25T20:56:49.980 回答