2013-03-07 30 views
0

搜索時發現此threat。這很安靜,接近我所需要的。Python - 如何查找並保存兩個特定字符串之間的所有單詞

至極直接導致了我的第一個問題:

我的字符串是:

line = <draw:line draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:x1="0cm" svg:y1="0cm" svg:x2="3.5cm" svg:y2="2.7cm"> 

我需要提取SVG後的值:X1 =標籤。所以我試了

print re.findall(r"(?<=svg:x1) (.*?) (?=svg:y1)", line) 

但是除[]以外都沒有打印。

第二個問題是我又試圖像

line = 'string1 string2 string3' 

然後

print re.findall(r"(?<=string1) (.*?) (?=string3)", line) 

至極給我想要的東西,但是當我嘗試

file.write(re.findall(r"(?<=string1) (.*?) (?=string3)", line)) 

(文件I想寫的東西當然是之前定義的,所以我可以寫東西給它)

我得到「類型錯誤:預期的字符緩衝區對象」

所以現在我在一個完整的句子:) 問題,我怎麼能提取字符串之間的特定字符串,並將其保存在一個文件?

+0

的http://計算器。com/questions/2717856/any-good-and-gentle-python-regexp-tutorials-out-there – 2013-03-07 11:15:50

回答

0

這是你想要的嗎?

In [10]: re.findall('svg:x1="([^"]*)"', line) 
Out[10]: ['0cm'] 

編輯:

re.findall('svg:x1="(\d*)cm"', line) 

In [11]: re.findall('svg:x1="(\d*)cm"', line) 
Out[11]: ['0'] 
+0

我想要沒有「cm」的那個。但是,這似乎非常好。請你試着解釋爲什麼在輸出中排除「」,我在閱讀文檔時試圖理解,但由於英文不是我的母語,這對我來說似乎有點困難。 – user2143528 2013-03-07 12:10:00

+0

「都在inter()之外。 – waitingkuo 2013-03-07 12:20:12

0

你可以做到沒有正則表達式,就像這樣。

def get_middle_text(line, string_start, string_end): 
    temp = line.split(string_start)[1] 
    return temp.split(string_end)[0] 


result = get_middle_text(line, 'string1', 'string2') 

編輯:

的比賽。如果你可以有多個匹配,你可以這樣做以下,並返回現場:

def get_middle_text(line, string_start, string_end): 
    tmp = line.split(string_start) 
    result = [] 
    if len(tmp) == 1: 
     return result 
    for x in range(1, len(tmp)): 
     temp = tmp[x].split(string_end)[0] 
     result.append(temp) 
    return result 
+0

這樣做的問題是,由於必須提取多個值,因此必須多次調用此函數,這是低效的。 @ jitendra的正則表達式解決方案更好。 – 2013-03-07 11:21:44

2

下面的正則表達式

print re.findall(r"(?<=svg:x1) (.*?) (?=svg:y1)", line) 

你寫在svg:x1後面的空格不在原始字符串中。正確的正則表達式將是

print re.findall(r"(?<=svg:x1)(.*?)(?= svg:y1)", line) 

您編寫的正則表達式表達式返回一個列表。您將不得不迭代列表以將項目寫入文件。

data=re.findall(r"(?<=svg:x1)(.*?)(?= svg:y1)", line) 
fl.write(' '.join(data)) 

請勿使用file作爲變量。它是Python中的一個保留字。

+1

用'fl.write(''.join(match))'替換'for'循環可能更高效。 – 2013-03-07 11:19:09

+1

@KyleStrand你是對的。我編輯瞭解決方案並實施了您的建議。 – jitendra 2013-03-07 11:22:08

+0

看起來不錯,但我怎樣才能刪除「」和釐米,以便我只收回整數? – user2143528 2013-03-07 12:15:43

相關問題