2017-12-05 23 views
0

필자는 Python을 사용하여 자신의 응용 프로그램을 간단한 계정 관리자로 만들려고 노력해 왔습니다.이 응용 프로그램은 휴대 전화에서 SMS를 읽고 일부 정규식 패턴을 기반으로 정보를 추출합니다.파이썬에서 regex에서 단 하나의 문자열을 추출하는 방법은 무엇입니까?

복잡한 정규 표현식 패턴을 작성한 후 https://pythex.org/에서 테스트했습니다. 예 : 나는 str.extract() 메소드를 사용하기보다는 하나의 결과를 얻는 파이썬에서 동일한 작업을 수행 할 때

그러나
Text: 1.00 is debited from ******1234 for food 

Pattern: (account|a\/c|ac|from|acct|savings|credit in|ac\/|sb\-|acc|a\/c)(\s|\.|\-)*(no|number)*(\.|\s|:)*\s*(ending)*\s*(((n{1,}|x{1,}|[0-9]+|\*{1,}))+)\-*((n{1,}|x{1,}|[0-9]+|\*{1,}|\s))*\-*([0-9]*) 

Result: from ******1234 

는, 나는 각 그룹에 대한 열이있는 dataframe을 얻고있다.

파이썬 코드는 다음과 같습니다 : 위의 메시지에 대한 파이썬 코드의

all_sms=pd.read_csv("all_sms.csv") 

pattern = '(account|a\/c|ac|from|acct|savings|credit in|ac\/|sb\-|acc|a\/c)(\s|\.|\-)*(no|number)*(\.|\s|:)*\s*(ending)*\s*(((n{1,}|x{1,}|[0-9]+|\*{1,}))+)\-*((n{1,}|x{1,}|[0-9]+|\*{1,}|\s))*\-*([0-9]*)' 

test = all_sms.extract(pattern, expand = False) 

출력 :

0   from 
1    
2   NaN 
3   NaN 
4   NaN 
5  ******1234 
6   1234 
7   1234 
8    
9    
10    

내가 파이썬에 아주 새로운 오전과 실무 경험을 통해 배우려고 노력하고, 누군가 내가 이것을 잘못 알고 있다고 지적 할 수 있다면 정말 도움이 될 것입니다.

+2

각각의 이스케이프 처리되지 않은'('.) 중복 캡쳐 그룹 제거 –

+0

구체적인 언어에 관한 내용은 언어 태그 사용을 고려하십시오. – doctorlove

답변

2

정규 표현식 패턴으로 들어가기 전에 팬더를 사용하는 이유를 이해해야합니다. 팬더는 데이터 분석에 적합하므로 (문제에 적합) 하지만 과장된 것처럼 보입니다.

팬더라면 이 복잡하기 때문에 파이썬 표준 라이브러리를 알고 있기 때문에 에 도움이되므로 초보자라면 순수한 파이썬을 사용하는 것이 좋습니다. 지금 기본 사항을 건너 뛰면 장기적으로 당신을 해칠 수 있습니다.

당신은 내가 다음과 같이 진행 것이다 (팬더없이) python3를 사용하려고 고려 :

# Needed imports from standard library. 
import csv 
import re 

# Declare the constants of my tiny program. 
PATTERN = '(account|a\/c|ac|from|acct|savings|credit in|ac\/|sb\-|acc|a\/c)(\s|\.|\-)*(no|number)*(\.|\s|:)*\s*(ending)*\s*(((n{1,}|x{1,}|[0-9]+|\*{1,}))+)\-*((n{1,}|x{1,}|[0-9]+|\*{1,}|\s))*\-*([0-9]*)' 
COMPILED_REGEX = re.compile(PATTERN) 

# This list will store the matched regex. 
found_regexes = list() 

# Do the necessary loading to enable searching for the regex. 
with open('mysmspath.csv', newline='') as csv_file: 
    csv_reader = csv.reader(csv_file, delimiter=' ', quotechar='"') 
    # Iterate over rows in your csv file. 
    for row in csv_reader: 
     match = COMPILED_REGEX.search(row) 
     if match: 
      found_regexes.append(row) 

print(found_regexes) 

반드시이 복사 - 붙여 넣기하여 문제를 해결하려고하지 그러나 이것은 당신에게 아이디어를 줄 수 귀하의 문제에 대한보다 간단한 접근 방법을 제공합니다.

+0

자세한 답변과 설명 주셔서 감사합니다. 잠시만 :) –