2010-09-14 8 views
1

我正在玩堆棧溢出數據轉儲,並試圖構造(我想象的是)一個簡單的正則表達式,以從<>字符中提取標籤名稱。因此,對於每個問題,我有一個或多個標記列表,如<tagone><tag-two>...<tag-n>,並試圖提取標記名稱列表。下面是從數據採取一些例如標籤字符串轉儲:正則表達式(Python)從< and >的內部提取文本字符串 - 例如<stringone><string-two>等

<javascript><internet-explorer> 

<c#><windows><best-practices><winforms><windows-services> 

<c><algorithm><sorting><word> 

<java> 

僅供參考,我需要劃分標籤名稱爲的話,那麼像<best-practices>例子,我想找回best-practices(不是bestpractices)。另外,對於它的價值,我使用Python,如果它有任何區別。有什麼建議麼?

+0

什麼格式的數據轉儲? XML? JSON? – 2010-09-14 11:35:59

回答

3

由於沒有嵌入<>你可以使用正則表達式#1的標籤名稱:

<(.*?)> 

<([^>]*)> 

說明:

  • <:一個文字<
  • (..):分組並記住 匹配。
  • .*?:以非貪婪的方式匹配 中的任何內容。
  • >:一個文字<
  • [^>]:一個字符類來匹配其他 什麼比一個>
2

這裏是一個快速和骯髒的解決方案:

#!/usr/bin/python 

import re 
pattern = re.compile("<(.*?)>") 
data = """ 
<javascript><internet-explorer> 

<c#><windows><best-practices><winforms><windows-services> 

<c><algorithm><sorting><word> 

<java> 
""" 

for each in pattern.findall(data): 
    print each 

更新

法定警告:如果數據轉儲使用XML或JSON(作爲其中一個用戶評論),那麼使用合適的XML或JSON解析器會更好。

3

而不是做數據轉儲(不管他們是什麼)和使用正則表達式,你可能有興趣使用Stackoverflow API和json代替。

例如,從這個問題剔除標籤,你可以這樣做:

import urllib2 
import json 
import gzip 
import cStringIO 

f=urllib2.urlopen('http://api.stackoverflow.com/1.0/questions/3708418?type=jsontext') 
g=gzip.GzipFile(fileobj=cStringIO.StringIO(f.read())) 
j=json.loads(g.read()) 

print(j['questions'][0]['tags']) 
# [u'python', u'regex'] 
相關問題