2017-11-08 1 views
1

다음 문자열을 고려하여 목록의 여러 문자열에서 숫자 데이터를 추출하고 싶습니다.Python에서 regex를 사용하여 문자열에서 숫자 데이터 추출하기

'\ n 내역 : \ r \ n \ t \ r \ n \ t \ t \ t \ t \ t \ t20 \ r \ n \ t \ t \ t \ t \ t \ \ r \ n를 t \ t \ t \ t \ NVIEWS : 20,087 \ nRating0/5 \ n '

I 즉, 뷰의 수치 데이터를 추출하고자, 20,087 및 그 답장을위한 좋은 보유 즉,

나는 다음과 같은 출력을 얻을 다음을 수행 정규식 코드를 사용하여 파이썬

view = re.findall("\W*Views*:\D*(\d+)*,(\d+)", str(string_name)) 
    replies = re.findall("\W*Views*:\D*(\d+)", str(string_name)) 

를 사용 (20);

전망 : [('20', '087')]

응답 : [ '20'] 나는에 대한 동일한 코드를 실행하려고하면

그러나이 문제가 발생 다음의 캐릭터 라인.

'\ n 내역 : \ r \ n \ t \ r \ n \ t \ t \ t \ t \ t \ t20 \ r \ n \ t \ t \ t \ t \ t \ r \ n \ t \ t \ t \ t \ n보기 : 208 \ nRating0/5 \ n '

실제로는 원하는 목록이 아닙니다. 또한, 나는 34 개의 다른 문자열 목록을 찾기 위해 모든 것을 하나의 루프로 돌린다.

views = [] 
    replies = [] 

    for data in data_container: 
     statistics = data.find("ul", class_ = 'threadstats') 
     view = re.findall("\W*Views*:\D*(\d+)*,(\d+)", str(statistics)) 
     views.append(view) 
     repl = re.findall("\W*Replies*:\D*(\d+)", str(statistics)) 
     replies.append(repl) 

그래서 루프를 실행할 때 다음과 같은 결과가 표시됩니다. 이는 내가 찾고있는 것이 아닙니다 !!

조회수 : [[('20', '087')] [('44', '467')], (('6', '975' [], [], [], [], [], [], [], [], [], [] ], [], [], [], [], [], [], [], [], [], [] [] []]

2 자리 숫자로 구성된 숫자 데이터가 누락되었습니다. 어떤 도움이라도 대단히 감사 할 것입니다.

+0

https://ideone.com/RwfXKS을보십시오. 첫 번째 경우에 대해서는 잘 모르겠다.'views : [('20', '087')]'또는'views : ['20, 087 ']'가 필요합니까? –

+0

보기로보기 : ['20, 087 '] –

+0

다음 [내 대답] (https://stackoverflow.com/a/47177955/3832970)을 참조하십시오. 다른 답변은 기본적으로 작동하지 않지만 원할 경우 "시도"할 수 있습니다. 실제로 * 사용할 수 * 내 솔루션, 필요가 없습니다 "시도". –

답변

0

I가 숫자 (\d)를 추출 제안되고 그 뒤에 0+ 문자 숫자 또는 쉼표 ([\d,]*)를 사용하여 결과 목록에서 전체 서식있는 번호를 얻을 수 있도록하십시오.

(3210)는 Python demo 참조 :

import re 

string_names = ['\nReplies:\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t20\r\n\t\t\t\t\t\r\n\t\t\t\t\nViews: 208\nRating0/5\n', 
       '\nReplies:\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t20\r\n\t\t\t\t\t\r\n\t\t\t\t\nViews: 20,087\nRating0/5\n'] 
for string_name in string_names: 
    view = re.findall(r"\bViews:\D*(\d[\d,]*)", string_name) 
    replies = re.findall(r"\bReplies:\D*(\d[\d,]*)", string_name) 
    print("view = {}; replies = {}".format(view, replies)) 

출력 :

view = ['208']; replies = ['20'] 
view = ['20,087']; replies = ['20'] 
0

시도해보십시오.

Views\s*\:\s*([0-9\,\.]*?)\\ 
0

이 시도 :

(\W\w)*[rR]eplies:(\W\w)*(?<replies>\d+)(\W\w)*[vV]iews:\s(?<views>\d+,?\d+).* 

그것은 별도의 그룹으로 당신에게 모두 응답 및 의견을 줄 것이다 : 예.입력

'\nReplies:\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t20\r\n\t\t\t\t\t\r\n\t\t\t\t\nViews: 208\nRating0/5\n' 

'응답'그룹 : 20

'보기 그룹 : 208

See it on regex101

관련 문제