2014-07-01 61 views
2

我使用python在GAEPython的正則表達式的谷歌應用程序引擎

我想從HTML以下

<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD> 

我想,將有一個「V」,後面的一切7個或更多的數字,並在它後面。

我的正則表達式是

response = urllib2.urlopen(url) 
html = response.read() 
tree = etree.HTML(html) 
mls = tree.xpath('/[V]\d{7,10}</FONT>') 
self.response.out.write(mls) 

它拋出了一個無效的表達。我不知道它的哪一部分是無效的,因爲它適用於在線正則表達式測試程序

我該如何在xpath格式中執行此操作?

回答

2
>>> import re 

>>> s = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>' 

>>> a = re.search(r'(.*)(V[0-9]{7,})',s) 

>>> a.group(2) 
'V1068078' 

EDIT

(.*)是貪心法。 re.search(r'V[0-9]{7,}',s)將用貪婪的方式進行提取。

編輯正如@Kaneg所說,你可以使用findall所有實例。您將得到的'V[0-9]{7,}'

+0

謝謝Suku。如果我想使用xpath,那麼我應該怎麼做? – user3211229

+0

在搜索開始時執行貪婪搜索'(。*)'有什麼意義? –

+0

@MartinKonecny,對了。我們在這裏不需要它。編輯我的答案。 – Suku

1

所有出現一個列表下面的工作:

result = re.search(r'V\d{7,}',s) 
print result.group(0) # prints 'V1068078' 

它將匹配長度7個或更多的數字位後面的字母V

編輯任何字符串

如果您想要查找所有實例,請將search替換爲findall

s = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>V1068078 V1068078 V1068078' 
re.search(r'V\d{7,}',s) 
['V1068078', 'V1068078', 'V1068078', 'V1068078'] 
+0

是的,如果您想查找超過1個,更新了我的答案。 –

1

下面的例子可以匹配多種情況:

import re 
s = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V10683333</FONT></TD>,' \ 
' <TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068333333</FONT></TD>' 
m = re.findall(r'V\d{7,}', s) 
print m 
0

而且沒有捕獲組的一個。

>>> import re 
>>> str = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>' 
>>> m = re.search(r'(?<=>)V\d{7}', str) 
>>> print m.group(0) 
V1068078 
2

我怎樣才能做到這一點在XPath?

您可以在這裏使用starts-with()

>>> from lxml import etree 
>>> html = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>' 
>>> tree = etree.fromstring(html) 
>>> mls = tree.xpath("//TD/FONT[starts-with(text(),'V')]")[0].text 
'V1068078' 

或者你可以使用正則表達式

>>> from lxml import etree 
>>> html = '<TD><FONT FACE="Arial,helvetica" SIZE="-2">V1068078</FONT></TD>' 
>>> tree = etree.fromstring(html) 
>>> mls = tree.xpath("//TD/FONT[re:match(text(), 'V\d{7,}')]", 
      namespaces={'re': 'http://exslt.org/regular-expressions'})[0].text 
'V1068078' 
1

給大家,保持張貼純粹的正則表達式的解決方案,你需要閱讀的問題 - 這個問題不只是制定一個正則表達式;這是一個隔離XML/HTML文檔樹的正確節點的問題,正則表達式可以用來隨後隔離所需的字符串。

您沒有顯示任何導入語句 - 您是否嘗試使用ElementTree?爲了使用ElementTree,您需要從根到目標標籤(在您的情況下,「TD/FONT」)對XML/HTML的結構有一定的瞭解。接下來,您將使用ElementTree方法,「find」和「findall」來遍歷樹並獲取所需的標籤/屬性。

由於一直noted previously,「ElementTree中使用它自己的路徑語法,這是更或XPath少一個子集。如果你想要一個帶XPath的支持ElementTree的兼容庫,嘗試lxml。」 ElementTree支持xpath,但不是您在這裏使用它的方式。

如果你確實想要使用ElementTree,你應該提供一個你正試圖解析的html的例子,所以每個人都有一個結構的概念。在沒有這樣一個例子的情況下,下面的例子看起來如下:

import xml, urllib2 
from xml.etree import ElementTree 


url = "http://www.uniprot.org/uniprot/P04637.xml" 
response = urllib2.urlopen(url) 
html = response.read() 
tree = xml.etree.ElementTree.fromstring(html) 
# namespace prefix, see https://stackoverflow.com/questions/1249876/alter-namespace-prefixing-with-elementtree-in-python 
ns = '{http://uniprot.org/uniprot}' 
root = tree.getiterator(ns+'uniprot')[0] 
taxa = root.find(ns+'entry').find(ns+'organism').find(ns+'lineage').findall(ns+'taxon') 
for taxon in taxa: 
    print taxon.text 

# Output: 
Eukaryota 
Metazoa 
Chordata 
Craniata 
Vertebrata 
Euteleostomi 
Mammalia 
Eutheria 
Euarchontoglires 
Primates 
Haplorrhini 
Catarrhini 
Hominidae 
Homo