【问题标题】:How can I extract text between quotes and replace it?如何提取引号之间的文本并替换它?
【发布时间】:2021-02-08 19:12:23
【问题描述】:

我想做的是从文件 (1.) 中加载文本,然后将两个引号之间的每个文本片段替换为输出,这取决于输入。

整个程序会做什么的例子: 输入文件:

pet_1 = "Dog"
pet_2 = "Cat"
pet_3 = "Dog"

输出文件是:

pet_1 = "First Dog"
pet_2 = "First Cat"
pet_3 = "Second Dog"

这就是我想要的方式,但我不知道如何编码:

1.):从文本文件中加载文本: (这是我唯一能做的部分):

file = open('file.txt', 'r')
string = file.read()
file.close()

2.):提取引号之间的文本并将其放在一个列表中:

输入:

pet_1 = "Dog"
pet_2 = "Cat"

输出将是:["Dog", "Cat"]

3.):修改这个列表的项目:

例如:["First Dog", "First Cat"]

4.):将文本片段再次放在正确的位置:

例子:

pet_1 = "Dog"
pet_2 = "Cat"

我之所以要这样做,是因为我有一个大约 4750 行的巨大文本文件,我不想手动修改它。希望你能理解。

【问题讨论】:

  • 帮你什么?你能更具体地谈谈你的问题吗?如果您尝试过的方法不适合您,请与我们分享。
  • 另外,你如何从string = file.read()pet_1 = "Dog" pet_2 = "Cat" 我假设你想将字符串拆分成一个列表,然后对其中的每个元素执行操作,例如预先添加一些字符串并从那里开始。也许创建该列表的副本,以便您以后可以再次使用它,但这只是猜测。
  • 问题草图中您实际询问的 4 个任务中的哪一个?

标签: python python-3.x text replace


【解决方案1】:

不完全确定您要做什么以及是否会受到大小写(大写字母)的影响,但您可以尝试:

with open('file.txt', 'r') as f:
    string = f.read()

pet_1 = 'Dog'
pet_2 = 'Cat'

something = input("Input: ") + ' '

string = string.replace(pet_1, (something + pet_1))
string = string.replace(pet_2, (something + pet_2))

pet_1 和 pet_2 不会受到影响,如果我理解正确,变量也不需要“重新放回正确的位置”。

【讨论】:

    【解决方案2】:

    您可以使用带有回调函数的re.sub 来获得“动态”替换,例如根据要替换的字符串调用函数。这样,您可以使用字典或collections.defaultdict 并根据要替换的动物获取next 前缀。

    text = """
    pet_1 = "Dog"
    pet_2 = "Cat"
    pet_3 = "Dog"
    """
    
    import re, collections
    count = collections.defaultdict(lambda: iter(["First", "Second", "Third", "Fourth"]))
    res = re.sub(r'"([^"]+)"', lambda m: f'"{next(count[m.group(1)])} {m.group(1)}"', text)
    

    之后,res

    pet_1 = "First Dog"
    pet_2 = "First Cat"
    pet_3 = "Second Dog"
    

    更多解释:

    • countdefaultdict,将每个单词/动物映射到诸如“first”、“second”等单词的迭代器。
    • re.sub 将使用正则表达式查找 "..." 中的部分,然后使用回调函数推导出实际替换
    • 正则表达式r'"([^"]+)"' 表示“一个引号,然后是一些不是引号的字符,然后是另一个引号”
    • lambda 是回调函数,它创建一个格式字符串,该格式字符串由来自与该单词关联(或新创建)的迭代器的 next 前缀和单词本身组成,m.group(1) 指的是到(...) 中正则表达式匹配的部分

    (很明显,iter(["First", ...]) 可能需要用更多元素扩展以获得更长的列表,或者只使用 itertools.count(1) 来获取数字而不是单词。)

    【讨论】:

    • 亲爱的 tobias_k,感谢您的回答,并为我写的不好的问题道歉。但就目前而言,“真正”的原因是翻译文本片段。我在 python 中翻译没有问题,但遗憾的是没有使用 re 或 lambda 的经验,所以如果你能写一个适合上下文的答案,那就太好了。
    • @ChristianPatzl 我不明白。答案不是得出你想要的结果吗?或者您想要没有relambda 的答案?在后一种情况下:这些是最好的工具;学习使用它们,不要试图绕过它们。
    • 答案很好,但不是我想要的。我试图阅读 re 文档,但我就是不明白
    • @ChristianPatzl 那你想要什么?除了添加“第一”、“第二”部分之外,“翻译文本片段”是什么意思?
    猜你喜欢
    • 2013-08-05
    • 2012-07-22
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2020-02-20
    相关资源
    最近更新 更多