2012-10-31 5 views
3

저는 파이썬 2.7과 BeautifulSoup을 사용하고 있습니다. abc 또는 a.b.c와 같은 머리 글자를 찾아야합니다. 및 거짓 긍정을 피하십시오 qweabcrty. 패턴은 문자열의 시작 부분에있을 수 있으며 끝에는 공백, 인용 부호, 큰 따옴표, 하이픈 (등등)을 사용할 수 있습니다.약어를 찾고 그 패턴으로 구성된 단어를 피하는 정규 표현식

나는

  • ABC
  • 주류 통제위원회 소속위한 괜찮이 정규식

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

    에 와서

  • ㅋ (ABC)
  • ABC-ㅋ
  • 어쩌구 ABC
  • ㅋ ABC ㅋ
  • 어쩌구 ABC-ㅋ

는하지만 그것은 또한 발견된다

  • (그리고 난 몰라) 원하는 :

    • qweabcrty
    ,

    을 제거하면 어떻게됩니까? 둘 다 [^ \ w] 후에 더 이상 사례 1, 2, 4 및 5를 찾지 못합니다. 이전 및/또는 후에 무언가를 찾으려고하기 때문입니다.

    길고도 짧은 이야기, 나는이를 지정하는 방법 : ABC 문자열 에 anywere 수 있지만 경우 캐릭터 전 및/또는 영숫자 하나 안 후이있다. 같은

    파이썬 코드는 같습니다

    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

    @ 루카 : 제 견해에서 더 가독성있게 보입니다. – georg

    관련 문제