如何替换python中另一个单词之前出现的单词

时间:2017-03-21 07:16:29

标签: python text

如果单词A出现在操作符之前,我想用另一个单词B替换(重新拼写)文本字符串中的单词A.单词A可以是任何单词。 E.G:

Hi I am Not == you

因为" Not"在操作员" =="之前发生,我想用alist替换它[" Not"] 所以,上面的句子应该改为

Hi I am alist["Not"] == you

另一个例子

My height > your height

应该成为

My alist["height"] > your height

编辑: 根据@Paul的建议,我正在编写我自己编写的代码。 它有效,但它太笨重,我不满意。

operators = ["==", ">", "<", "!="]        
    text_list = text.split(" ")
    for index in range(len(text_list)):           
        if text_list[index] in operators:
            prev = text_list[index - 1]
            if "." in prev:
                tokens = prev.split(".")
                prev = "alist"
                for token in tokens:
                    prev = "%s[\"%s\"]" % (prev, token)
            else:
                prev = "alist[\"%s\"]" % prev
            text_list[index - 1] = prev
    text = " ".join(text_list)

3 个答案:

答案 0 :(得分:2)

这可以使用正则表达式

来完成
import re
...
def replacement(match):
    return "alist[\"{}\"]".format(match.group(0))
...
re.sub(r"[^ ]+(?= +==)", replacement, s)

如果不需要单词和“==”之间的空格,则最后一行变为:

re.sub(r"[^ ]+(?= *==)", replacement, s)

我强烈建议你研究正则表达式,以及它们的python实现,因为它们非常有用。

解释我的解决方案:

re.sub(pattern, replacement, s)用给定的字符串或函数的输出替换作为正则表达式给出的模式的出现。

我使用函数的输出,将整个匹配的对象放入'alist [“...”]'结构中。 (match.group(0)返回整场比赛)

[^ ]匹配任何空格。

+尽可能多地匹配最后一个子模式,但至少一次。

*尽可能经常匹配最后一个子模式,但它是可选的。

(?=...)是一个先行者。它检查当前光标位置之后的内容是否与括号内的模式匹配,但是在最终匹配中不包括它们(至少不在.group(0)中,如果在预测中有组,则可以通过.group(index))。

答案 1 :(得分:0)

您可以尝试使用regular expression library我能够为您的问题创建一个简单的解决方案,如下所示。

import re
data = "Hi I am Not == You"
x = re.search(r'(\w+) ==', data)
print(x.groups())

在此代码中,re.search查找(1个或多个)字母数字字符的模式,后跟operator(“==”),并将结果(“Hi I am Not ==”)存储在变量x中。< / p>

然后,对于交换,您可以使用CodenameLambda建议的re.sub()方法。

我还建议学习如何使用正则表达式,因为它们对于解决许多不同的问题很有用,并且在不同的编程语言之间是相似的

答案 2 :(得分:0)

str = "Hi I am Not == you"
s = str.split()
y = ''
str2 = ''
for x in s:
    if x in "==":
        str2 = str.replace(y, 'alist["'+y+'"]')
        break
    y = x

print(str2)