python:用减号替换精确

python:用减号替换精确,python,regex,Python,Regex,给定以下字符串: "-local locally local test local." 我的目标是将字符串“local”替换为“we”,从而使结果变为 "-local locally we test local." 到目前为止(在stackoverflow的帮助下:)我已经能够得到以下正则表达式: variable='local' re.sub(r'\b%s([\b\s])' %variable, r'we\1', "-local locally local test local.") 但

给定以下字符串:

"-local locally local test local."
我的目标是将字符串“local”替换为“we”,从而使结果变为

"-local locally we test local."
到目前为止(在stackoverflow的帮助下:)我已经能够得到以下正则表达式:

variable='local'
re.sub(r'\b%s([\b\s])' %variable, r'we\1', "-local locally local test local.")
但是,我对该代码有两个问题:

  • 搜索通过减号,输出为:

    '-we locally we test local.'
    
    它应该在哪里

    '-local locally we test local.'
    
  • 搜索以负号(如“-local”)开头的字符串会导致搜索失败


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


    当然效率不高:)

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

    当然效率不高:)

    尝试以下方法:

    re.sub(r'(^|\s)%s($|\s)' % re.escape(variable), r'\1we\2', some_string)
    
    另一个问题中建议的正则表达式有点奇怪,因为character类中的
    \b
    表示退格字符

    基本上,您现在拥有的是一个正则表达式,它搜索目标字符串,在开始处有一个单词边界(从单词字符到非单词字符,反之亦然),在结束处有一个空白字符

    因为你不想匹配最后的“local”,因为它后面有一个句点,我不认为单词边界是这里的方法,相反,你应该寻找空白或字符串的开头/结尾,这就是上面正则表达式所做的

    我还在变量上使用了
    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.'
    
    请尝试以下操作:

    re.sub(r'(^|\s)%s($|\s)' % re.escape(variable), r'\1we\2', some_string)
    
    另一个问题中建议的正则表达式有点奇怪,因为character类中的
    \b
    表示退格字符

    基本上,您现在拥有的是一个正则表达式,它搜索目标字符串,在开始处有一个单词边界(从单词字符到非单词字符,反之亦然),在结束处有一个空白字符

    因为你不想匹配最后的“local”,因为它后面有一个句点,我不认为单词边界是这里的方法,相反,你应该寻找空白或字符串的开头/结尾,这就是上面正则表达式所做的

    我还在变量上使用了
    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.'
    
    我不做python,但我的想法是在模式中查找local之前和之后放置一个空格,并在替换中包含空格


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

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

    search = "local"
    replace = "we"
    s = "-local locally local test local."
    result = ' '.join([x if not x == search else replace for x in s.split(" ")])
    

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

    search = "local"
    replace = "we"
    s = "-local locally local test local."
    result = ' '.join([x if not x == search else replace for x in s.split(" ")])
    

    如果输入数据只有几千行,并且比正则表达式可读性更好,那么这就足够了。在代码中:
    “”.join(“如果p==“local”则为we,否则在s.split()中p为p”)
    如果输入数据只有几千行,并且比正则表达式可读性更好。在代码中:
    “”.join(“如果p==“local”,则为we”在s.split()中,否则p代表p
    +1但对于以local开头的行,此操作失败,您需要另一个
    sed的/^local/we/g”文件名来完成此操作。l4mpi:我意识到我的解决方案可能过于具体。我试图解决所提出的问题,因为不清楚他是否希望替换行开头的local(特别是因为他没有替换
    local.
    中的
    local
    )。希望在我们两人之间,他能找到他想要的东西。:)+1但对于以local开头的行,此操作失败,您需要另一个
    sed的/^local/we/g”文件名来完成此操作。l4mpi:我意识到我的解决方案可能过于具体。我试图解决所提出的问题,因为不清楚他是否希望替换行开头的local(特别是因为他没有替换
    local.
    中的
    local
    )。希望在我们两人之间,他能找到他想要的东西。:)这管用!但哪一个更有效,还是F的解决方案更有效。J@alandalusi正则表达式效率更高,但如果输入量不大,我会定期使用这样的代码;e、 g.对于一个~100k行的csv文件,你可能不会注意到现代pc上的差异。这很有效!但哪一个更有效,还是F的解决方案更有效。J@alandalusi正则表达式效率更高,但如果输入量不大,我会定期使用这样的代码;e、 g.对于~100k行的csv文件,您可能不会注意到现代pc上的差异。为什么您不能用
    'we'
    切换出
    'local'
    ?为什么您不能用
    'we'
    切换出
    'local'