3

私は python 2.7 とBeautifulSoupを使用しています。abcabcなどの頭字語を見つけて、qweabcrtyのような誤検知を避ける必要があります。パターンは、文字列の先頭、末尾、前後にスペース、引用符、二重引用符、ハイフン (など) を使用できますが、英数字は使用できません。

私はこの正規表現に来ます

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

それは大丈夫です

  • abc
  • abc
  • 何とか(abc)
  • なんとなく
  • なんてこった
  • 何とか何とか何とか
  • 何とか何とか

しかし、それも見つかりました(そして、私はしたくありません):

  • qweabcrty

?を削除すると、? 両方の[^\w]の後、ケース 1、2、4、および 5 は検出されません。

簡単に言えば、これをどのように指定できますか: abc は文字列内の任意の場所に配置できますが、その前後に文字がある場合は、英数字であってはなりません

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

1 に答える 1

3

単語境界 ( \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>blah-@@@</a>
 <a>blah @@@ blah</a>
 <a>blah-@@@-blah</a>
 <a>qweabcrty</a>
</html>
于 2012-10-31T09:52:48.083 に答える