如果字符仅出现在开头,则替换它
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”。 或者您可以使用正则表达式来查找和替换更复杂的模式。
【讨论】:
以上是关于如果字符仅出现在开头,则替换它的主要内容,如果未能解决你的问题,请参考以下文章