2012-10-31 79 views
3

我正在使用python 2.7和BeautifulSoup。 我需要找到一個首字母縮略詞,例如abca.b.c.並避免像qweabcrty這樣的假陽性。該模式可以在字符串的開頭,最後可以在前後有空格,引號,雙引號,連字符(等等),但不能是字母數字字符。尋找首字母縮寫詞的正則表達式,避免由該模式組成的詞

我來到這個正則表達式

[^\w]?a\.?b\.?c\.?[^\w]? 

這是確定的

  • ABC
  • A.B.C.
  • 等等(ABC)
  • ABC-等等
  • 等等-ABC
  • 等等ABC等等
  • 等等-ABC-等等

但它也發現(我不想):

  • qweabcrty

如果我刪除了之後[^ \ w]它不會再找到案例1,2,4和5,因爲它期望在之前和/或之後找到某些內容。

長話短說,我怎麼可以指定此: ABC可以anywere串的,但如果有一個人物之前和/或之後它不能是字母數字的。

的Python代碼看起來像:

import re 
from bs4 import BeautifulSoup, SoupStrainer 

html = """ 
<html> 
<a>abc</a> 
<a>a.b.c.</a> 
<a>blah (abc)</a> 
<a>abc-blah</a> 
<a>blah-abc</a> 
<a>blah abc blah</a> 
<a>blah-abc-blah</a> 
<a>qweabcrty</a> 
</html>""" 

links = BeautifulSoup(html, "lxml", parse_only=SoupStrainer(["a"])) 

tags = links.find_all("a", text = re.compile("[^\w]?a\.?b\.?c\.?[^\w]?", re.I)) 
print tags 

回答

4

嘗試使用單詞邊界(\b)元字符:

html = """ 
<html> 
<a>abc</a> 
<a>a.b.c.</a> 
<a>blah (abc)</a> 
<a>abc-blah</a> 
<a>blah-abc</a> 
<a>blah abc blah</a> 
<a>blah-abc-blah</a> 
<a>qweabcrty</a> 
</html>""" 

import re 
print re.sub(r'\b(abc|a\.\b.\.c)\b', '@@@', html) 

打印

<html> 
<a>@@@</a> 
<a>@@@.</a> 
<a>blah (@@@)</a> 
<a>@@@-blah</a> 
<a>[email protected]@@</a> 
<a>blah @@@ blah</a> 
<a>[email protected]@@-blah</a> 
<a>qweabcrty</a> 
</html> 
+0

謝謝,似乎工作,我問!只是一個問題:你爲什麼用_(abc | a \。\ b。\。c)_而不是_(a \。?\ b.?\.c?)_?它更快? – Luca

+0

@Luca:在我看來,這看起來更具可讀性 – georg

相關問題