2013-03-18 54 views
-1

我試圖用Python語言編寫一個腳本,「清理」像這樣的一些文件饋文字:在Python正則表達式變量擴展

for i in range(1,10): 
    number = 1 
    cleanText = re.sub('number.','',line).strip() 
    number = number + 1 
    print cleanText 

一個例子文件將是:1,你好,世界2 。你好地球

我在這裏需要做的是去除編號和點以及領先的空白空間一舉。但我怎樣才能首先執行簡單的可變擴展?

謝謝大家提前。

+0

你爲什麼要指定1〜'number',然後通過1每次迭代遞增呢? (爲什麼'''那裏根本就沒有使用過) – 2013-03-18 20:05:08

+0

難道你不能只使用匹配任何數字的正則表達式嗎? – Kevin 2013-03-18 20:05:25

+0

我認爲你正在尋找PHP特性,其中一個字符串中引用的變量可以替換爲它的echo值。 Python沒有這個。有'printf'(略有不同),但在這裏不適用 – 2013-03-18 20:07:55

回答

2

正如其他人所說,您應該簡單地使用與任何數字匹配的正則表達式,例如r"\d"r"\d+"。但是,出於學習的目的,這裏是你所要求的答案。

「變量擴展」最接近的有用相當於是字符串格式化操作:

cleanText = re.sub('%d.' % number, line).strip() 

你也可以使用str(number) + '.'來達到同樣的效果。您的代碼還有幾個問題:

  • 您的循環錯誤;如果你正在迭代range(1, 10),那麼你不需要手動增加number。你可能意思是range(1, 11)

  • .在正則表達式語法中匹配任何字符;你想要\.

清潔的後續版本可能是這樣的:

cleanText = line.strip() 
for i in xrange(1, 11): 
    cleanText = re.sub(r'%d\.', '' , cleanText) 
+0

在第三行中,'%?'之前使用的是什麼? – kstratis 2013-03-18 20:15:45

+2

@ Konos5這是一個所謂的原始字符串,意味着反斜槓被視爲文字,不用於轉義序列(除了轉義封閉的引用類型)。請參閱http://docs.python.org/2/reference/lexical_analysis.html#string-literals – l4mpi 2013-03-18 20:17:00

+1

@ Konos5「%d \。」前面的** r **完全沒有道理。這樣一個** r **可以去掉某些字符串中出現的反斜槓的影響,比如''\ n \ t \ a \ b \'等''。序列''\ .''不是字符串級別的轉義序列:''.''是一個點,''.'''是一個反斜槓和一個點。點。 ''.'''是一個正則表達式模式級別的轉義序列。當它們表示正則表達式中的反斜槓時,使用原始字符串(前面的** r **)更容易。除了這種情況,它沒有帶來任何東西使用原始字符串 – eyquem 2013-03-18 22:01:40

3

如果你的文件格式是保證像你說:

1. Hello, World 
2. Hello earth 

你甚至都不需要使用正則表達式,您可以使用splitjoin

clean_line = ' '.join(line.split(' ')[1:]).lstrip() 

>>> ' '.join("1. Hello, world".split(' ')[1:]) 
'Hello, world' 

或者,如果你還是想要做替代,這replace基礎的代碼可能工作:

number = 1 
for line in file_handle: 
    clean_line = line.replace("%d. " % number, "").lstrip() 
    number += 1 
+0

或',對於數字,在枚舉中的行(file_handle,1):...' – user4815162342 2013-03-18 20:15:56

+0

@ Valdogg21你的第二個解決方法是replace())''''''''''''''''''''''''''''''你的第一個解決方案是基於一個好主意,但是閱讀文檔'strip()'並寫入:'line.lstrip()。split(None,1)[1]'' 'print'\ n'.join(line.lstrip()。split(None,1)[1]爲text.splitlines(1)中的行)''爲文本 – eyquem 2013-03-18 22:39:04

0
import re 
fp = open('line','r') 
for line in fp: 
    pattern = re.match(r'[0-9]*\.(.*)',line) 
    if pattern: 
     print pattern.group(1) 
    else: 
     print line