3

我正在寻找一种替换单词的方法,但是只有当它没有被引号包围时。

例如替换HelloHi

Hello 'Hello' NothingHi 'Hello' Nothing

由于'Hello'在引号中,它不会被替换,但第一个会被替换,Hello因为它没有被引号包裹。

任何帮助都会很棒!

4

6 回答 6

3

正则表达式很棒:

>>>import re

>>>expression = re.compile("(?!(\"|'))Hello(?!(\"|'))")
>>>expression.sub("Hi",'This string says "Hello" and Hello')

This string says "Hello" and Hi

唯一的问题是它也无法替换“Hello and Hello”,如果这成为问题,您可以为它们添加特定案例。

于 2012-05-17T19:44:19.943 回答
1

考虑使用正则表达式(不是唯一的方法,但我会这样做)。

In [2]: print s
Hello 'Hello' Nothing
In [3]: import re
In [4]: re.sub("(?<!')Hello(?!')", 'Hi', s)
Out[4]: "Hi 'Hello' Nothing"
于 2012-05-17T19:42:49.480 回答
1

使用正则表达式:

>>> import re
>>> re.sub(r'([^"\']|^)Hello([^"\']|$)', r'\1Hi\2', "Hello mate")
'Hi mate'
>>> re.sub(r'([^"\']|^)Hello([^"\']|$)', r'\1Hi\2', "'Hello' mate")
"'Hello' mate"

'([^"\']|^)Hello([^"\']|$)'表示“ Hello字符串被不同于单引号或双引号的东西包围,或者位于行的开头或结尾”。

于 2012-05-17T19:50:58.643 回答
0

这适用于您的测试用例。

import re
foo = "Hello 'Hello' Nothing"
mt = re.search(r"[^']Hello(\s+.*)", foo)
if mt:
   foo = 'Hi' + match.group(1)
于 2012-05-17T19:45:10.590 回答
0

尝试这个:

import re

def callback(match):
   rep = 'Hi'
   return match.group(1)+rep+match.group(2)

your_string = "Hello 'Hello' Nothing"
print re.sub("([^\']|^)Hello([^\']|$)", callback, your_string)

这将匹配Hello被任何内容包围的单词,除了'^in[]表示除此之外的任何内容)。我还添加了|^and|$来匹配字符串末尾或开头的单词Hello

它将替换为括号中的第一部分以及 Hi 和第二部分(无论它们是什么)。

于 2012-05-17T19:41:43.680 回答
0

使用 substring 函数查找要替换的单词的所有出现,对于每个单词,查看 substring 函数返回的内容之前的一个索引,并查看它是否是引号。

例如。“”你好'你好'没什么”

子字符串函数返回 0 -- 所以当然没有引号 子字符串函数返回 6 -- 检查字符串 [5] -- 有一个引号,寻找下一次出现

您如何继续使用 substring 函数进行检查?像这样的东西:

startindex=0
while(!done):
      index=substr(string, startindex)
      if(str[index-1] == "'")
            startindex=index 
            continue

从这里你会明白的

于 2012-05-17T19:42:58.580 回答