2015-02-06 3 views
2

"hell"을 포함한 모든 단어를 한 문장으로 찾으려고합니다. 아래 문자열에는 3 번 발생합니다. 하지만 re.search는 처음 2 번만 반환합니다. 나는 findall과 search 모두 시도했다. 누군가 나에게 무엇이 잘못되었는지 말해 줄 수 있습니까?Python3에서 문자열의 모든 단어 찾기

>>> s = 'heller pond hell hellyi' 
>>> m = re.findall('(hell)\S*', s) 
>>> m.group(0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'list' object has no attribute 'group' 
>>> m = re.search('(hell)\S*', s) 
>>> m.group(0) 
'heller' 
>>> m.group(1) 
'hell' 
>>> m.group(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: no such group 
>>> 

답변

5

당신은 re.findall를 사용하고 없거나과 hell를 검색 할 수 있습니다 Padraic의 대답은 확실히 이것에 대해 이동하는 가장 좋은 방법입니다

re.compile(r""" 
    \S*   # zero or more non-space characters 
    hell   # followed by a literal hell 
    \S*   # followed by zero or more non-space characters""", re.X) 

주 : 즉

In [4]: re.findall(r"\S*hell\S*", 'heller pond hell hellyi') 
Out[4]: ['heller', 'hell', 'hellyi'] 

양쪽에 더 많은 단어 문자 :

>>> import re 
>>> s = 'heller pond hell hellyi' 
>>> re.findall('\w*hell\w*', s) 
['heller', 'hell', 'hellyi'] 
>>> 
+0

이것은 완벽하게 작동합니다. 왜 이것이 잘못된지 아십니까? >>> m = re.search ('(hell) \ S *', s). 나는 처음 2 번의 출현만을 되 돌린다. "hellyi"는 반환되지 않습니다. – Vin

+0

아니요, 두 번 발생하지 않습니다. 're.search'는 첫 번째 만 얻습니다. 캡처 그룹과 일치하는 값이므로 '지옥'이 표시됩니다. 그것은 여전히'heller'의 일부입니다. – iCodez

2
당신은 str.split를 사용하고 문자열이 각 단어에 있는지 볼 수 있습니다

: 만 hell 일치하고 있기 때문에 귀하의 정규식 hell을 찾는되지

s = 'heller pond hell hellyi' 

print([w for w in s.split() if "hell" in w]) 
+0

고마워요! 정규식을 통해이를 수행 할 수있는 방법이 있습니까? 나는 아직도 그것을 배우고 RE를 사용하여 그것을 시도하고 정말로 싶다. – Vin

+0

@Vin, yes findall을 사용하면 간단히 Icodez 대답을 할 수 있습니다. 효율성에 대해 신경 쓰지 않는다면 정규식 –

2

이 아닌 다른 선행 공백 문자. 대신 문자 그대로 hell을 찾으십시오. 멋진 것은 아닙니다. 귀하의 코멘트 당

In [3]: re.findall('hell', 'heller pond hell hellyi') 
Out[3]: ['hell', 'hell', 'hell'] 

편집

, 당신은이 단어의 중간에 찾았다 경우 전체 단어를 반환합니다. 어떤 경우에는 * 0 또는 or 한정 기호를 사용해야합니다.

[word for word in "heller pond hell hellyi".split() if 'hell' in word] 
+0

을 사용하십시오.하지만 "heller", "hell", "hellyi"를 반환하고 싶습니다. 그래서 \ S 나 다른 이스케이프 문자를 주어야합니다. – Vin

+0

"에서"통신 수는 그 (것)들을 줄 것입니다 –

0

어쩌면 그것은 나이지만 정규 표현식을 거의 사용하지 않습니다. 파이썬 3에는 광범위한 텍스트 기능이 있습니다. 빌트인 함수를 사용하는 것이 잘못된 이유는 무엇입니까?

'heller pond hell hellyi'.count('hell') 

내가보기에 유일한 단점은 정규식을 사용하는 법을 배우지 못하는 것입니다. :-)

관련 문제