2011-10-06 64 views
0

我是一个初学者与PYTHON和无用的正则表达式,并努力用一个新的数字替换文件中的未知数字。我已经浏览了python,了解了如何创建表达式,但仍然无法取得任何进展。python字符串替换未知的数字

# myfile.txt 
Some text 
More text 
Option "BlankTime" "15" 
more text 

我要替换“15”与另一个号码,该行只在文件中出现一次,但行号是上是未知的,值15也是未知的,不应该是个包含在引号中。

最好的办法是用python(re ??)来做,但如果不能做到,那么也许sed?

+1

你知道如何打开一个文件,然后一行行提取它? – phimuemue

+0

请发布您迄今为止编写的代码。如果你确切地展示你设法学到的东西,它会有很大的帮助。 –

+0

感谢所有的建议,是的,我知道如何打开一个文件并逐行循环,但我希望使用现有的函数而不是循环的单行程。 – crankshaft

回答

1

这听起来像你正在寻找一个特定的参数(BlankTime)。这可以通过以下sed的一行来完成:

cat myfile.txt | sed 's/\("BlankTime"\s*"\)[^"]*/\1987/' 

这会搜索"BlankTime"987取代它的​​价值,使所有其他线路不变。

编辑要替换文件的内容,请使用以下两个步骤的方法:

cat myfile.txt | sed 's/\("BlankTime"\s*"\)[^"]*/\1987/' > myfile.txt.tmp 
mv myfile.txt.tmp myfile.txt 
+0

嗨,很好,这是我所希望的,但我需要实际更改文件中的文本,而不是打印修改后的输出。我已经尝试将结果回显到文件中,但所有回车符和空白符都已被删除:echo -e $(cat myfile.txt | sed's/\(“BlankTime”\ s *“\)[ ^“] */\ 1987 /')> myfile.txt – crankshaft

+0

@crankshaft:看我的编辑。 – NPE

+0

嗨,它几乎可以工作,但其中一个引号被从输出中剥离:选项\t 987“ – crankshaft

-1
myfile = open('myfile.txt', 'r') 
text = myfile.read() 
myfile.close() 

print re.sub(r'\d+', '42', text) 

\d相匹配的号码,+匹配前面的图案中的至少一个发生。

+0

由于文本可能包含一个数字,因此匹配引号会更安全:'re.sub(r'“(\ d +)”','42',text)' – rplnt

+0

这就是您的假设。根据OP的问题,这并不重要。 – j0057

0
import re 
with open("myfile.txt", "r") as myfile: 
    mytext = myfile.read() 
pattern = re.compile(r'^(Option\s+"BlankTime"\s+")(\d+)"', re.MULTILINE) 
mystr = pattern.sub(r'\1REPLACED"', mytext) 
with open("myfile.txt", "w") as myfile: 
    myfile.write(mytext) 

这将一次替换文件中的所有事件。我已经把这个数字放在括号内,以防在替换之前你想用它做点什么。

+0

谢谢,我也要试试这个, – crankshaft

0

sed会做得很好。下面是一个命令来更改号码为“69”

sed -i 's/\"BlankTime\" \"[0-9]*\"/\"BlankTime\" \"69\"/g' myfile.txt

和这里的工作原理是:

  • sed程序
  • -i编辑就地文件”的名字“
  • s/old/new/g是有意义的搜索和替换为, 全球(即所有实例)
  • \"BlankTime\" \"69\"是字符串字面 "BlankTime" "69"(引号使用反斜杠转义,以避免 壳吃起来正则表达式。在这种情况下,我认为他们实际上并没有 严格需要,因为表达式进行转义是'保护'在单引号,但它是一个好习惯,进入 无论如何)
  • \"BlankTime\" \"[0-9]*\"是一个正则表达式匹配任何字符串,如"BlankTime" "34875025784320",这里[0-9]意味着任何数字0 1 2 3 4 5 6 7 8 *和*表示重复最后的任意次数(包括零次数,所以请注意"BlankTime" ""也会匹配,如果这不是您想要的,请将*更改为a +意味着> = 1次。
  • myfile.txt您的文件名