2015-01-28 1 views
0

this topic의 확장 질문입니다. 나는 "w"다음의 키워드 시리즈와 같은 전체 문자열과 부분 문자열에서 검색하려는 :팬더 및 "다시"- 전체 및 부분 문자열 검색

rigour* 
*demeanour* 
centre* 
*arbour 
fulfil 

이것은 분명히 내가 태도 도중에 엄격하고 엄격 , 같은 단어를 검색하고 싶어하고 있음을 의미 태도 , 중심 및 중심 , h 아버 및 아버 등을 만족시킨다. 따라서 내가 가지고있는 키워드 목록은 찾을 수있는 전체 및 부분 문자열을 혼합 한 것입니다. 다음

ID;name 
01;rigour 
02;rigours 
03;endemeanour 
04;endemeanours 
05;centre 
06;centres 
07;encentre 
08;fulfil 
09;fulfill 
10;harbour 
11;arbour 
12;harbours 

내가 지금까지 뭘하려 : 다음

r = re.compile(r'.*({}).*'.format('|'.join(w.values)), re.IGNORECASE) 

나는 DataFrame를 필터링 마스크를 구축했습니다 :이 DataFrame "안양"에 대한 검색을 적용 할 것

을 키워드에 새 열을 얻기 위하여
mask = [m.group(1) if m else None for m in map(r.search, df['Tweet'])] 

결과 :

df['keyword'] = mask 
,536,913 이 *없는 w 목록을 사용하여 작동

ID;name;keyword 
01;rigour;rigour 
02;rigours;rigour 
03;endemeanour;demeanour 
04;endemeanours;demeanour 
05;centre;centre 
06;centres;centre 
07;encentre;None 
08;fulfil;fulfil 
09;fulfill;None 
10;harbour;arbour 
11;arbour;arbour 
12;harbours;None 

: 내가 기대하고있어 무엇

는 다음과 같은 결과 DataFrame입니다. 이제 re.compile 함수를 올바르게 실행하기 위해 * 조건이있는 단어 목록의 키워드를 포맷하는 데 몇 가지 문제가있었습니다.

도움이 될 것입니다. 정규식에서 *가 자체적으로 작동하지 않는 것을 후에가는 것을

rigour.* 
.*demeanour.* 
centre.* 
\\b.*arbour\\b 
\\bfulfil\\b 

참고 :

답변

1

그것은이 같은 정규식 패턴으로 사용할 수 있도록 조정해야 w 귀하의 의견 시리즈처럼 보인다. 그것은 그것이 따르는 것이 0 번 이상 반복 될 수 있다는 것을 의미합니다.

또한 fulfilfulfill의 일부이며 엄격한 일치를 원할 경우 정규 표현식에이를 알려야합니다. 예를 들어 '단어 분리 기호'- \b을 사용하면 문자열 전체를 잡을 수 있습니다.

s = '({})'.format('|'.join(w.values)) 
r = re.compile(s, re.IGNORECASE) 
r 

re.compile(r'(rigour.*|.*demeanour.*|centre*|\b.*arbour\b|\bfulfil\b)', re.IGNORECASE) 

및 교체를하도록 코드가 .where 방법과 같이 팬더와 함께 할 수있다 :

df['keyword'] = df.name.where(df.name.str.match(r), None) 
df 

      ID   name  keyword 
     0 1  rigour  rigour 
     1 2  rigours  rigours 
     2 3 endemeanour endemeanour 
     3 4 endemeanours endemeanours 
     4 5  centre  centre 
     5 6  centres  centres 
     6 7  encentre   None 
     7 8  fulfil  fulfil 
     8 9  fulfill   None 
     9 10  harbour  harbour 
     10 11  arbour  arbour 
     11 12  harbours   None 
+0

여기

은 정규식 당신에게 필요한 결과를 제공하기 위해 같이하는 방법입니다 고마워요! 하나의 질문입니다. 엄격함과 센터의 차이점은 무엇입니까? 끝에 ". *"부분이 있어야합니까? –

+0

잘 보입니다. 그렇습니다, 그들은 같은 결말을 가져야합니다'. *'. 이 오타를 수정했습니다. – Primer

+0

고마워. 긴 문자열을 검색 할 때조차도 새로운 '키워드'열을 올바르게 가져 오려면 map에있는 m에 대해 'mask = [m.group (1) if else none]을 사용하는 것이 좋습니다.search, df [ 'name'])]''df [ 'Keyword'] = mask'는 각 문자열에있는 올바른 키워드를 반환해야합니다. –