2016-06-08 7 views
1

아래 문장은 처리하고자하는 문장입니다. 앞면에 두 개의 해시 (##2312435)와 나머지 텍스트로 시작하는 ID로 구성됩니다. 나는 단어가 likely 인 문장을 찾을 수있는 정규 표현식이 필요하며 전체 문장과 ID를 검색합니다.파이썬 정규식 : 마침표와 마침표로 특정 단어가 포함 된 전체 문장을 반환하십시오.

문장 :

## 2312435 존이 집에 없습니다. 존은 자정 이후 집에 올 가능성이 있습니다. 또 다른 관련 문장이 아닙니다. # 2233442 마크는 매우 화가났습니다. 마크는 오늘 밤 맥주를 마셨다.

나는이 작성하는 관리 :

(?=.\*((?<=##)\d+))(?=.*([^.]+(likely)+[^.]+)) 

을하지만 전체 문장을 검색하지 않습니다.

결과는 같을 것이다 예상 : 나는 그립에서 고군분투하고 있기 때문에 2,312,435 요한이 자정 이후 집에 올 가능성이 2,233,442 마크는, 오늘 밤에게 맥주를

난 그냥 일반적인 지식이 요청하고있는 것 같다 둘러보기가 있습니다. 난이 정규식없이 이미 해결했지만, 나는 그것을 줄 수있는 정규식을 사용하여 필요한 정보를 검색하려고 생각. 감사합니다

+0

당신은 모든 것을 위해 정규식이 필요 없다는 것을 알고 있습니까? – glls

+0

그래, 나는 그들없이 이미 그것을했지만, 나는 정규 표현식으로 연습을하고 싶었고 이것을 해결할 수 없었다는 것을 깨닫는다. – Rkey

+1

확인.그것을 귀하의 게시물에 추가하고 싶습니다 당신의 정규식을 검색 할 수있는 기대를 추가하십시오 (예) – glls

답변

2

그래서 그것은 매우 추한, 그리고 경우에만 작동하는 경우 단어 likely와가 하나 개의 문장 :

re.findall(r'##(\d+)(?:[^#]*\.)*([^#.]*?likely[^#.]*?)\.', text, re.IGNORECASE) 

# Output: 
#[('2312435', ' John is likely to come home after midnight'), 
# ('2233442', ' Mark is likely to have a beer tonight')] 
예를 들어
0
p = re.compile(r'^##\d+.*likely.*$') 
res = p.match(t).group().replace('##','') 

,

>>> t = '##2312435 Jon is not home. John is likely to come home after midnight. Another not related sentence. ##2233442 Mark is very angry. Mark is likely to have a beer tonight.' 
>>> p = re.compile(r'^##\d+.*likely.*$') 
>>> res = p.match(t).group().replace('##','') 
>>> print res 
2312435 Jon is not home. John is likely to come home after midnight. Another not related sentence. 2233442 Mark is very angry. Mark is likely to have a beer tonight. 
0

이 작업에 대한 모든 정규식 것이다 보기 흉하지만 적어도 우리는 그것을 효율적으로 만들 수 있습니다.

기본 정규식은 ## + 숫자가 아닌 다시 텍스트, 다음 ## + 숫자, likely 아닌 모든 텍스트를 일치의 ## + 숫자 일치 이러한 숫자를 캡처하는 것입니다.

##(\d+)\s*((?:(?!##\d).)*\blikely\b(?:(?!##\d).)*) 

regex demo을 참조하십시오. (?:(?!##\d).)*은 정규식 엔진의 경우 다소 부담이가는 강화 된 욕심 토큰입니다.

우리는 같은 성능 증가를 풀다 수 있습니다

##(\d+)\s*([^#]*(?:#(?!#\d)[^#]*)*\blikely\b[^#]*(?:#(?!#\d)[^#]*)*) 

이 아직도 그 효율적이지 않습니다 another demo

참조하십시오, 당신은 전체 단어 likely를 확인할 필요가없는 경우, 사용할 수있는

##(\d+)\s*([^#l]*(?:#(?!#\d)[^l#]*|l(?!ikely)[^l#]*)*likely[^#]*(?:#(?!#\d)[^#]*)*) 

아직 another regex을 참조하십시오.