2009-10-21 7 views
1

즉, 특정 도메인 용 텍스트 블록에있는 모든 URL을 일치시켜야하며 특정 쿼리 문자열 매개 변수를 포함하지 않으며 value (refer = twitter)Regex : 특정 도메인에 대한 URL 일치 특정 쿼리 문자열 매개 변수에 특정 값이있을 때 제외

다음 정규 표현식을 사용하여 도메인의 모든 URL을 일치시킵니다.

\b(https?://)?([a-z0-9-]+\.)*example\.com(/[^\s]*)? 

난 그냥 마지막 부분은 그래서 다음

example.com 
http://example.com/ 
https://www.example.com#link 
www.example.com?somevalue=foo 

일치해야

(?![&?]refer=twitter)\b(https?://)?([a-z0-9-]+\.)*example\.com(/[^\s]*)? 

를 동작하지 않습니다 그러나 이러한해야하지

https://www.anotherexample.com#link 
www.example.com?refer=twitter 

편집 : 그리고 요 u는이 기간을 따기없이

For examples go to http://example.com?foo=foo.bar. 

같은 문장의 아웃

http://example.com?foo=foo.bar 

에 맞게 얻을 수 있습니다, 그것은 좋은 것입니다!

EDIT2 : 이

\b(https?://)?([a-z0-9-]+\.)*example\.com/?([^\s]*[^.])? 

EDIT3와 마침표의 문제를 해결 :이 작동하는 것 같다 , 또는 내가

(?!\b.*[&?]refer=twitter)\b(https?://)?([a-z0-9-]+\.)*example\.com/?([^\s]*[^.])? 

던져 한 시험의 최소 99 % EDIT4 :

\b(?!.*[&?]refer=twitter)(https?://)?([a-z0-9-]+\.)*nygard\.com(?!\.)[^\s]*\b+ 
+0

그리고 우리는 "이제 두 가지 문제가 있습니다"라는 설명을 자제 할 수 있습니다. – CaffGeek

+2

사용자 생성 텍스트에서 URL을 추출하기위한 정규 표현식은 거의 불가능합니다. 세 가지 문제가 있습니다. 입력에 대한 제어가 없으며 일반적인 두 정규식 문제입니다. :) – jmucchiello

+1

당신은 "거의 불가능합니다"라고 말하면서 정의상 가능하다는 뜻입니다. – CaffGeek

답변

1
(?!\b.*[&?]refer=twitter) 

원하는 것을 찾았습니다.

+0

나는 몇 분 후에 너를 때렸다! LOL 좋은 일을하지만, 거의 끝났습니다 구두점 (기간, explamation 포인트 등) 이후에 공백을 넣지 않으면 99.9 %가 실패하지만 구별하기가 불가능하다는 점을주의해야합니다. 난 그냥 정규식의 끝을 조금 더 정리해야하고 그것은 준비가 될거야. (예 : \? .com [^ \ *]) \ b (https : //)? ([a-z0-9-] + \ b + – CaffGeek

-1

솔직히 말하면, 처음에는 정규식을 사용하는 생각이 내 마음을 교차시키지 못했습니다 (이것은 좋은 기호입니다 - 정규 표현식을 사용해야 함, IMO는 항상 기본이 아닌 보조 선택이되어야 함). 여기 내가 선택한 언어로 어떻게 할 것인가?

>>> from urlparse import urlparse, parse_qs 
>>> p = urlparse(r'http://foo.bar.com/baz?refer=twitter&rock=paper') 
>>> parse_qs(p.query) 
{'rock': ['paper'], 'refer': ['twitter']} 

여기에서 무엇이든 할 수 있습니다.

+0

기록상 나는 투표하지 않았다. 개인적으로 사람들이 정규 표현식이 최후의 수단이라고 생각하는 이유를 알지 못하고 싫어합니다.필자는 그것들을 좋은 해결책으로 생각하고, 작성하기 쉽고, 많은 문자열 파싱 및 조작보다 작업을 완료하는 데 어려움이 적다는 것을 알았지 만 그것은 제 생각입니다. – CaffGeek

+0

글쎄, 당신은 자신을 모순됩니다. 먼저 정규 표현식을 사용할 수없는 방법에 대한 질문을 던지지 만 오류가 발생하기 쉽습니다. 다른 한편으로는, 표준 라이브러리 함수에 대한 두 번의 호출을 어떻게 잘못 할 수 있는지를 보지 못했습니다 (예제에서와 같이). 나는 정규 표현식이 전혀 배워서는 안된다는 말은 아니다. 실제로 그들에 대한 나의 태도는 나의 경험 (때로는 좋거나, 때로는 나쁨)에 기인합니다. – shylent

+0

"글쎄, 당신은 자신을 모순된다. 먼저 정규 표현식을 사용할 수 없다는 질문을 던지면 오류가 발생하기 쉽다. 그것은 전혀 모순이 아닙니다. 정규 표현식에서 하나의 실패 지점이 있습니다. 정규 표현식 그 자체이며 목적은 데이터 문자열을 구문 분석하고 유효성을 검사하는 것입니다. 왜 나는 여러 줄의 코드에서 그것을 다시 만들고 싶습니까? 결함이있는 정규 표현식보다 결함있는 코드를 작성하는 경향이 훨씬 큽니다. – CaffGeek

관련 문제