2013-07-10 2 views
0

안녕하세요 여러분, 저는 Python을 처음 접했고 도움이되었습니다.파이썬을 사용하여 문자열을 따옴표로 묶은 문장과 숫자로 나누는 방법

21357.53 84898.10 Mckenzie Meadows Golf Course 80912.48 84102.38 

그리고 따옴표없이 주변 시세 및 복식과 단어 (예 : "Mckenzie Meadows Golf Course".)의 그룹을 기반으로 라인을 분할하는 방법을 알아 내려고 노력하고 있어요 :

I는 다음과 같이 여러 문자열을 .

그때 문자열을 정리하고는이 형식이어야합니다 :

"Mckenzie Meadows Golf Course" 21357.53 84898.10 80912.48 84102.38 

난 그냥

for row in data: 
    outfile.write('{0} {1} {2} {3} {4}'.format(row[2], row[0], row[1], row[3], row[4])) 
    outfile.write('\n') 

사용하는 것이 재 배열하지만 난 그냥 하나의 인용 문장을 얻는 방법을 잘 모르겠어요 라인 밖으로. 도와 주셔서 감사합니다!

+0

, 이 형식으로,'float float string float float'? – zhangyangyu

+0

입력을 명확하게하기 위해 더 많은 행을 게시하십시오. –

답변

2

이 내가 할 것이 방법입니다 그 :

import re 

tgt='21357.53 84898.10 Mckenzie Meadows Golf Course 80912.48 84102.38' 

nums=[m.group() for m in re.finditer(r'[\d\.]+',tgt)] 
words=[m.group() for m in re.finditer(r'[a-zA-Z]+',tgt)] 
print '"{}" {}'.format(' '.join(words),' '.join(nums)) 

인쇄 :

nums=[] 
words=[] 
for e in tgt.split(): 
    try: 
     nums.append(float(e)) 
    except ValueError: 
     words.append(e) 

print words,nums  

을 마지막으로 4 수레의 고정 된 형식과 문자열이있는 경우 (:

"Mckenzie Meadows Golf Course" 21357.53 84898.10 80912.48 84102.38 
또는

, 파이썬이 어떻게 생각하는지 테스트 할 수 있습니다 그들을 찾기 위해 부동이다 부동, 플로트, 문자열, 부동, 플로트) 당신은 할 수 있습니다 :

li=tgt.split() 
nums=' '.join(li[0:2]+li[-2:]) 
words=' '.join(li[2:-2]) 
print words,nums 
+0

이것은 완벽하게 감사했습니다. – user2569441

2

이 시도 할 수 있습니다 :

이 시점에서
s = "21357.53 84898.10 Mckenzie Meadows Golf Course 80912.48 84102.38" 
sList = s.split(' ') 
words = [] 
nums = [] 
for l in sList: 
    if l.isalpha(): 
     words.append(l) 
    elif l.isdigit(): 
     nums.append(l) 

wordString = "\"%s\"" % " ".join(words) 
row = [wordString] + nums 

, row 당신이 원하는 행을 포함합니다.

+1

'list'를 변수 이름으로 사용하지 마십시오. :-( – dawg

+0

아니요,'.isalpha()'는 공백 문자에 대해 실패합니다. 단순한'.split()'을 많이 좋아하지만, 여기에서는 정규 표현식이 더 적합합니다. – 9000

+0

@ drewk, 좋은 지적입니다!나는 변경을 할 것이다 – jh314

1

코드 사용하여 정규 표현식 :

import re 

s = '21357.53 84898.10 Mckenzie Meadows Golf Course 80912.48 84102.38' 
row = re.search('([0-9.]+)\s([0-9.]+)\s([\w ]+)\s([0-9.]+)\s([0-9.]+)', s) 
if row: 
    print '"{0}" {1} {2} {3} {4}'.format(row.group(3), row.group(1), row.group(2), row.group(4), row.group(5)) 

이 (큰 따옴표) 인쇄됩니다 :

"Mckenzie Meadows Golf Course" 21357.53 84898.10 80912.48 84102.38 
0

사용 str 방법 :

>>> s = '21357.53 84898.10 Mckenzie Meadows Golf Course 80912.48 84102.38' 
>>> temp = s.split() 
>>> temp 
['21357.53', '84898.10', 'Mckenzie', 'Meadows', 'Golf', 'Course', '80912.48', '84102.38'] 
>>> row = [temp[0], temp[1], '"'+' '.join(temp[2:-2])+'"', temp[-2], temp[-1]] 
>>> row 
['21357.53', '84898.10', '"Mckenzie Meadows Golf Course"', '80912.48', '84102.38'] 
>>> print '{0} {1} {2} {3} {4}'.format(row[2], row[0], row[1], row[3], row[4]) 
"Mckenzie Meadows Golf Course" 21357.53 84898.10 80912.48 84102.38 
+0

문자열의 길이는 중요하지 않다. 문자열 앞뒤에 2 개의 부동 소수점 숫자가 있어야한다는 것이 중요하다. 그래서 나는 그 의견에 물었다. 나는'temp [2 : -2]'를 사용한다. @AshwiniChaudhary – zhangyangyu

0

str 방법, 012,341,599,837을 사용하여및 lambda :

>>> words = "21357.53 84898.10 Mckenzie Meadows Golf Course 80912.48 84102.38".split() 
>>> print '"%s" %s'%(" ".join(filter(lambda x: x.isalpha(), words)), " ".join(filter(lambda x: not x.isalpha(), words))) 
"Mckenzie Meadows Golf Course" 21357.53 84898.10 80912.48 84102.38 

더 엄격하게, 모든 비 알파를 가정하지 않고 단어 수레 (reduce을 사용)이다 : 그래서 당신이 개 부동 이전 번호와 후 또 다른 2가 있어야 의미

>>> words = "21357.53 84898.10 Mckenzie Meadows Golf Course 80912.48 84102.38".split() 
>>> print '"%s" %s'%(" ".join(filter(lambda x: x.isalpha(), words)), " ".join(filter(lambda x: reduce(lambda y, z: z.isdigit() and z, x.split('.'), True), words))) 
"Mckenzie Meadows Golf Course" 21357.53 84898.10 80912.48 84102.38 
관련 문제