2010-10-20 48 views
0

我有一個文本,其中只有<b></b>已被使用,例如<b>abcd efg-123</b>。我可以提取這些標籤之間的字符串嗎?我還需要在此字符串的前後塊之前和之後提取3個單詞。 我該怎麼做?這將是什麼適合的正則表達式?使用Python正則表達式在文本中查找字符串

+2

強制性:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-10-20 13:46:06

回答

1

處理<b>內部的標籤,除非它們是<b> ofcouse。

import re  
sometext = 'blah blah 1 2 3<b>abcd efg-123</b>word word2 word3 blah blah' 
result = re.findall(
     r'(((?:(?:^|\s)+\w+){3}\s*)'   # Match 3 words before 
     r'<b>([^<]*|<[^/]|</[^b]|</b[^>])</b>' # Match <b>...</b> 
     r'(\s*(?:\w+(?:\s+|$)){3}))', sometext) # Match 3 words after 

result == [(' 1 2 3<b>abcd efg-123</b>word word2 word3 ', 
    ' 1 2 3', 
    'abcd efg-123', 
    'word word2 word3 ')] 

這應該工作,並表現良好,但如果它得到更先進的話,那麼你應該考慮使用一個html解析器。

+0

如果以前沒有任何詞語,這不起作用或之後,或少於3個字,對嗎? – Hossein 2010-10-20 14:30:53

+0

@Hossein這是正確的。但這是一個簡單的改變。將{3}更改爲{,3} – driax 2010-10-20 16:42:42

0

你不應該使用正則表達式來進行HTML解析。 That way madness lies.

上面鏈接的文章實際上爲您的問題提供了一個正則表達式 - 但是並不是使用它。

3

這將讓標籤之間有什麼在,

>>> s="1 2 3<b>abcd efg-123</b>one two three" 
>>> for i in s.split("</b>"): 
... if "<b>" in i: 
...  print i.split("<b>")[-1] 
... 
abcd efg-123 
1

這實際上是一個非常愚蠢的版本,並且不允許嵌套的標籤。

re.search(r"(\w+)\s+(\w+)\s+(\w+)\s+<b>([^<]+)</b>\s+(\w+)\s+(\w+)\s+(\w+)", text) 

See Python documentation

相關問題