【问题标题】:Replace part of a matched string in python替换python中匹配字符串的一部分
【发布时间】:2013-12-06 16:49:19
【问题描述】:

我有以下匹配的字符串:

punctacros="Tasla"_TONTA  
punctacros="Tasla"_SONTA  
punctacros="Tasla"_JONTA  
punctacros="Tasla"_BONTA

我只想替换匹配字符串的一部分(下划线之前),其余部分在每个原始字符串中都应该保持不变。

结果应该是这样的:

TROGA_TONTA  
TROGA_SONTA  
TROGA_JONTA  
TROGA_BONTA

【问题讨论】:

  • 什么是匹配字符串?为什么中间有引号?
  • matched 表示我的正则表达式从正文中选择了它们。引号只是字符串中的文字字符。

标签: python regex replace


【解决方案1】:

编辑:

这应该可行:

from re import sub
with open("/path/to/file") as myfile:
    lines = []
    for line in myfile:
        line = sub('punctacros="Tasla"(_.*)', r'TROGA\1', line)
        lines.append(line)
with open("/path/to/file", "w") as myfile:
    myfile.writelines(lines)

结果:

TROGA_TONTA  
TROGA_SONTA  
TROGA_JONTA  
TROGA_BONTA

但是请注意,如果您的文件与给出的示例完全相同,您可以将 re.sub 行替换为:

line = "TROGA_"+line.split("_", 1)[1]

完全消除了正则表达式的需要。不过我没有这样做,因为您似乎想要一个正则表达式解决方案。

【讨论】:

  • 问题是我必须首先在文本中找到这些类型的字符串,然后必须用新字符串替换它们,保持它们的部分(下划线之后)不变。因此,它必须由一个正则表达式引擎来完成,它首先找到它们然后替换它们。
  • 我必须先在文本文件中找到它们,然后再替换它们。我不会将它们从 tex 中提取出来。替换零件后,它们将保留在文本文件中。
  • @Coddy - 哦,你应该在你的问题中提到这一点。请参阅我的编辑。这就是你想要的吗?
【解决方案2】:
mystring.replace('punctacross="Tasla"', 'TROGA_')

其中 mystring 是包含这四行的字符串。它将返回带有替换值的字符串。

【讨论】:

  • 我必须先在文本文件中找到它们,然后再替换它。我不会将它们从 tex 中提取出来。替换零件后,它们将保留在文本文件中。
  • 是的,你会的。字符串是不可变的,replace() 方法将返回带有替换部分的新字符串,而无需修改您的文件或原始字符串。
【解决方案3】:

如果你想替换第一个下划线之前的所有内容,试试这个:

#! /usr/bin/python3

data = ['punctacros="Tasla"_TONTA',
'punctacros="Tasla"_SONTA',  
'punctacros="Tasla"_JONTA',  
'punctacros="Tasla"_BONTA',
'somethingelse!="Tucku"_CONTA']

for s in data:
    print('TROGA' + s[s.find('_'):])

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 2011-05-28
    • 2016-09-14
    • 2014-03-22
    • 1970-01-01
    • 2021-07-11
    • 2023-02-16
    • 2021-03-09
    相关资源
    最近更新 更多