2011-10-06 67 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您的文件名