2014-01-30 111 views
2

我無法理解Python中的正則表達式模塊。我想我想做的事很簡單,但我無法弄清楚。Python在字符串中查找模式

我需要通過一些XML文件進行搜索,找到這個模式:

「顯示名稱=‘包裹(2012年10月1日)’」

我可以通過XML解析,並更換沒問題,我無法弄清楚的部分是如何做一個通配符搜索來查找「Parcels(some-date-year)」的任何實例。由於日期會有所不同,我需要找到這種模式:

pat = '"Parcels (*-*-*)"' 

,我想我可以用時間模塊做今天的日期來代替它。我抄了80行左右的XML文檔中的一行,我需要找到該模式。

根據re.search()函數的幫助,似乎我可以放入一個模式,然後我希望搜索的字符串。但是,我收到錯誤。

在模塊重新幫助上功能的搜索:

搜索(圖案,字符串標誌= 0) 掃描通過串尋找匹配的模式,返回 匹配對象,或無如果沒有匹配是找到。

這裏是我的小測試片段:

import re 
pat = '"Parcels (*-*-*)"' 
t= '   <Layer DisplayName="Parcels (7-1-2010)" FeatureDescription="Owner Name: {OWNER_NAME}&lt;br/&gt;Property Address: {PROP_ADDR}&lt;br/&gt;Tax Name: {TAX_NAME}&lt;br/&gt;Tax Address 1: {TAX_ADD_L1}&lt;br/&gt;Tax Address 2: {TAX_ADD_L2}&lt;br/&gt;Land Use: {USE1_DESC}&lt;br/&gt;&lt;a href=&quot;http://www16.co.hennepin.mn.us/pins/pidresult.jsp?pid={PID_NO}&quot;&gt;View Property Information&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;" FeatureLabel="Parcel ID: {PID_NO}" IconUri="{RestVirtualDirectoryUrl}/Images/Parcel.png" Identifiable="true" IncludeInLayerList="true" IncludeInLegend="true" Name="Parcels" Searchable="true" ShowMapTips="true" UnconfiguredFieldsSearchable="true" UnconfiguredFieldsVisible="true" Visible="true">' 
match = re.search(pat, t) 
print match 

大部分線路是垃圾我不需要擔心。我只需要看看如何在該行中找到該日期,以便我可以在replace()函數中使用該片段。有誰知道我怎麼能找到這些日期? xml中可能有其他日期,但我不需要替換它們;就是它說的「Parcels(some-date-year)」。我感謝任何幫助!謝謝!

+0

該模式需要是正則表達式。 http://docs.python.org/2/howto/regex.html可以幫助你嗎? – geoffspear

+0

這不是一個正則表達式 – njzk2

+3

大量的XML模塊,不要重蹈覆轍。 –

回答

1
import re 

t= '   <Layer DisplayName="Parcels (7-1-2010)" FeatureDescription="Owner Name: {OWNER_NAME}&lt;br/&gt;Property Address: {PROP_ADDR}&lt;br/&gt;Tax Name: {TAX_NAME}&lt;br/&gt;Tax Address 1: {TAX_ADD_L1}&lt;br/&gt;Tax Address 2: {TAX_ADD_L2}&lt;br/&gt;Land Use: {USE1_DESC}&lt;br/&gt;&lt;a href=&quot;http://www16.co.hennepin.mn.us/pins/pidresult.jsp?pid={PID_NO}&quot;&gt;View Property Information&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;" FeatureLabel="Parcel ID: {PID_NO}" IconUri="{RestVirtualDirectoryUrl}/Images/Parcel.png" Identifiable="true" IncludeInLayerList="true" IncludeInLegend="true" Name="Parcels" Searchable="true" ShowMapTips="true" UnconfiguredFieldsSearchable="true" UnconfiguredFieldsVisible="true" Visible="true">' 

你需要躲避括號,然後你可以更具體爲內容,通用字符是.*指0或更多:

pat = '"Parcels \(.*\)"' 
match = re.search(pat, t) 
print(match.group()) 

它打印:

"Parcels (7-1-2010)" 

一個更具體的圖案將是:

pat = '"Parcels \([0-9]+-[0-9]+-[0-9]+\)"' 
match = re.search(pat, t) 
print(match.group()) 

哪個打印:

"Parcels (7-1-2010)" 

在這裏,托架內容([0-9])一體地描述所有從0至9的數字(\d將等效)中,加,+,以下它們是指多於0,而破折號意味着它本身。

+0

謝謝Aaron!重新模塊的幫助有點令人困惑。我需要在那裏做更多的閱讀。那雖然做了。 – crmackey

+0

感謝您的第二個選項。這對我來說比第一個更有意義,並且可能會更好地標記數字字符。再次感謝! – crmackey

+1

我創建了一個基於最後一個小演示的幫助的快速參考卡。我應該可能發佈它。它基本上列出了特殊字符,特殊序列,模塊函數,標誌,函數幫助(相當完整的描述)以及我自己的最後一個小例子。 –

1

阿龍的回答是不錯的,只是一個小的修改,以配合它是什麼樣子,你希望這樣(符合規定的數據格式)

import re 

the_string = '<Layer DisplayName="Parcels (7-1-2010)" ... blablabla ' 
pattern = r'Parcels \(.*-.*-.*\)' 
match = re.search(pattern, the_string) 
print match.group() 

此外,如果您懷疑該字符串可能有超過1場,你可以使用findall方法打印所有匹配項。我還使用了\d+正則表達式,它只匹配字符串中的數字

import re 

the_string = '<Layer DisplayName="Parcels (7-1-2011)" ... blablabla ... Layer DisplayName="Parcels (7-1-2012)" ' 
pattern = r'Parcels \(\d+-\d+-\d+\)' 
all_matches = re.findall(pattern, the_string) 
for match in all_matches: 
    print match