如果字符仅出现在开头,则替换它

Posted

技术标签:

【中文标题】如果字符仅出现在开头,则替换它【英文标题】:Replace a character if it only appears at beginning 【发布时间】:2021-10-21 09:26:03 【问题描述】:

我有一个包含数百行的文件。如果变量名称以 $ 字符开头,我需要通读整个文件并替换变量名称,例如:

String $number1;
int $variable2;
double google$3;
......

在此示例中,代码应将 $number1 替换为 Nnumber1 并将 $variable2 替换为 Nvariable2 ,因此每次变量名称开头有 $ 时,它都会将其替换为 N 。但是,如果 $ 字符没有出现在开头,则不应更改变量名称。所以 google$3 保持不变 这是我的代码

# Read in the file
with open('filename', 'r') as file :
  data = file.read()

# Replace  string
data = data.replace('$', 'N')

# Write
with open('filename', 'w') as file:
  file.write(data)

但是我得到的结果不是我想要的。我将每次出现的 $ 替换为 N 我只想替换开头的 $。

String Nnumber1;
int Nvariable2;
double googleN3;

编辑:无法保证 $ 字符之前的内容可能是任何内容

【问题讨论】:

因为您已经将$ 替换为N,所以您想要将`$` 替换为$N。即data = data.replace(' $', '$N')。注意$ 符号前的空格 字符串是以$var开头还是var $number...开头? 你知道如何编写代码来检查字符串是否以$ 开头吗?如果你有,你能看看如何用它来解决问题吗? 在字符串开头出现的每一次$ 都保证是一个变量吗?还是我们在寻找模式var $... @PranavHosangadi 字符串以 var $number 开头。如果 $ 出现在变量的开头,则需要将其更改为 int $x 将更改为 Nx。 【参考方案1】:

如果所有一百行都与提供的示例相同,那么这肯定会起作用。但如果有任何区别,那么我可以告诉你这将完全有效。:

# Read in the file
with open('filename', 'r') as file :
    data = file.readlines()

newdata=[]
for line in data:
    if line[4:].startswith("$"):
    # OR
    if a.replace("var ","").strip().startswith("$"):
        newdata.append(line.replace("$","N"))
    else:
        newdata.append(line)

# Write
with open('filename', 'w') as file:
    for n in newdata:
        file.write(n)

或者试试这个,正如@Emad Khaleghpanah 所说:

newdata=[]
for line in data:
    newdata.append(line.replace("var $","var N"))

或者如果 "$number1" "number" 是肯定的:

newdata.append(data.replace("$n","Nn"))

你的例子总是有 $number1/2/3..... 模式。

【讨论】:

你的意思是如果行不同就不行了? 不,我的意思是模式不同。 如果行首有空格怎么办? @PranavHosangadi 我已经明确提到了,对吧?你不用问我!!! 你说“但是如果有什么不同,那么我可以告诉你这将完全有效”。我建议存在差异的可能性,它不会起作用。【参考方案2】:

根据问题变化更新:

import re

pattern = r'(?<![A-Za-z0-9])\$([A-Za-z_])'

filename = 'varnumbers.txt'

# Read in the file
with open(filename, 'r') as file :
    data = file.read()

# Replace  string
data = re.sub(pattern, r'N\1', data)

# Write
with open(filename, 'w') as file:
    file.write(data)

变化...

var $number1;
var $number2;
var number$3;


String $number1;
int $number2;
double number$3;

$number1*$number2

到...

var Nnumber1;
var Nnumber2;
var number$3;


String Nnumber1;
int Nnumber2;
double number$3;

Nnumber1*Nnumber2

补充:

如果您有一个具有regex 搜索功能的文本编辑器(Atom、VSCode、Sublime、Notepad++ 等),您可以在编辑器中使用该模式。如果您的任务是处理更多文件,Python 和脚本可能会更好,因为您可以遍历大量文件。

Sublime 中的替换示例(屏幕截图中显示的旧正则表达式):

【讨论】:

其实r's+(\$)应该是r'\s+(\$)。你在s+之前忘记了\ 谢谢!再次更新它以更强大:o) 谢谢! N\1 在这一行做了什么re.sub(pattern, r'N\1', data) re.sub() 里面有三个参数。首先使用变量pattern 的正则表达式模式;其次,如果它找到某些东西,用什么替换匹配,在这种情况下,它会放回一个文字 N 字符加上第一组 \1 中捕获的任何内容;最后一个参数是data,即文件中的文本。 @AronChabane 它回答了这个问题吗?我将正则表达式基于 Perl 变量允许的内容,因此 $ 然后是 A-Z(大写或小写)或下划线。我希望它有帮助:o?【参考方案3】:

您应该将“$”替换为“N”或将“var $”替换为“var N”。 或者您可以使用正则表达式来查找和替换更复杂的模式。

【讨论】:

以上是关于如果字符仅出现在开头,则替换它的主要内容,如果未能解决你的问题,请参考以下文章

如果字符串以某个字符开头,则替换它

替换jquery中字符串中多次出现的多个子字符串

带有标志的 Python re.sub 不会替换所有出现

如果存在,则替换文件中以字符串开头的行,如果不存在则添加

Hive 查询仅替换第一次出现的子字符串

如果不匹配则替换字符