仅在Python中替换不带引号的单词

仅在Python中替换不带引号的单词,python,Python,我正在寻找一种方法来取代一个词,但是只有当它没有被引用的时候 比如说 将Hello替换为Hi Hello'Hello'Nothing&rightarrowHi'Hello'Nothing 因为'Hello'在引号中,所以它不会被替换,但是第一个Hello会被替换,因为它没有用引号括起来 任何帮助都会很好 试试这个: import re def callback(match): rep = 'Hi' return match.group(1)+rep+match.group(2)

我正在寻找一种方法来取代一个词,但是只有当它没有被引用的时候

比如说 将
Hello
替换为
Hi

Hello'Hello'Nothing
&rightarrow
Hi'Hello'Nothing

因为
'Hello'
在引号中,所以它不会被替换,但是第一个
Hello
会被替换,因为它没有用引号括起来

任何帮助都会很好

试试这个:

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
匹配,该单词被除
以外的任何内容所包围。
[]
中的
^
表示除此之外的任何内容)。我还添加了
|^
|$
以匹配字符串末尾或开头的单词
Hello

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

考虑使用(这不是唯一的方法,但我同意)

[2]中的
:打印
你好,你好,没什么
在[3]中:导入re

在[4]:re.sub(“(?使用子字符串函数查找要替换的单词的所有出现处,对于每个单词,查看子字符串函数返回内容之前的一个索引,并查看其是否为引号

“你好,你好,没什么”

Substring函数返回0——所以当然没有引号 子字符串函数返回6--检查字符串[5]--有一个引号,查找下一个文档

如何继续使用子字符串函数进行检查?类似以下内容:

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

从这里你会发现正则表达式非常棒:

>>>import re

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

This string says "Hello" and Hi

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

这适用于您的测试案例

import re
foo = "Hello 'Hello' Nothing"
mt = re.search(r"[^']Hello(\s+.*)", foo)
if mt:
   foo = 'Hi' + match.group(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被不同于单引号或双引号的东西包围,或者在行的开头或结尾。”

双引号或单引号?使用re.sub如何
Hello'Hello Nothing'Nothing
?或者
Hello这不起作用。
>>> import re
>>> re.sub(r'([^"\']|^)Hello([^"\']|$)', r'\1Hi\2', "Hello mate")
'Hi mate'
>>> re.sub(r'([^"\']|^)Hello([^"\']|$)', r'\1Hi\2', "'Hello' mate")
"'Hello' mate"