我正在寻找一种替换单词的方法,但是只有当它没有被引号包围时。
例如替换Hello
为Hi
Hello 'Hello' Nothing
→Hi 'Hello' Nothing
由于'Hello'
在引号中,它不会被替换,但第一个会被替换,Hello
因为它没有被引号包裹。
任何帮助都会很棒!
我正在寻找一种替换单词的方法,但是只有当它没有被引号包围时。
例如替换Hello
为Hi
Hello 'Hello' Nothing
→Hi 'Hello' Nothing
由于'Hello'
在引号中,它不会被替换,但第一个会被替换,Hello
因为它没有被引号包裹。
任何帮助都会很棒!
正则表达式很棒:
>>>import re
>>>expression = re.compile("(?!(\"|'))Hello(?!(\"|'))")
>>>expression.sub("Hi",'This string says "Hello" and Hello')
This string says "Hello" and Hi
唯一的问题是它也无法替换“Hello and Hello”,如果这成为问题,您可以为它们添加特定案例。
考虑使用正则表达式(不是唯一的方法,但我会这样做)。
In [2]: print s
Hello 'Hello' Nothing
In [3]: import re
In [4]: re.sub("(?<!')Hello(?!')", 'Hi', s)
Out[4]: "Hi 'Hello' Nothing"
使用正则表达式:
>>> 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字符串被不同于单引号或双引号的东西包围,或者位于行的开头或结尾”。
这适用于您的测试用例。
import re
foo = "Hello 'Hello' Nothing"
mt = re.search(r"[^']Hello(\s+.*)", foo)
if mt:
foo = 'Hi' + match.group(1)
尝试这个:
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 和第二部分(无论它们是什么)。
使用 substring 函数查找要替换的单词的所有出现,对于每个单词,查看 substring 函数返回的内容之前的一个索引,并查看它是否是引号。
例如。“”你好'你好'没什么”
子字符串函数返回 0 -- 所以当然没有引号 子字符串函数返回 6 -- 检查字符串 [5] -- 有一个引号,寻找下一次出现
您如何继续使用 substring 函数进行检查?像这样的东西:
startindex=0
while(!done):
index=substr(string, startindex)
if(str[index-1] == "'")
startindex=index
continue
从这里你会明白的