2017-02-13 5 views
0

Пытается разбить строку на -- символ и вы хотите распечатать данные после --.Распечатайте только вторую часть строки split

Например:

1.Cleveland-Elyria-Mentor OH--17460 
2.Dallas-Plano-Irving TX (MSAD)--19100 
etc. 

Как только напечатать:

a.TX (MSAD) 
    OH 

и

b. 17460 
    19100 

Код:

#!/usr/bin/python 
    import csv 
    import re 

    sample="""columnA,ColumnB,columnC 
    1,Cleveland-Elyria-Mentor OH--17460 
    2,Dallas-Plano-Irving TX (MSAD)--19100 
    3,ASJDFJKDJ-kD-JE  WA--21092""" 


    open('sample.csv','w').write(sample) 
    with open('sample.csv') as sample, open('final_output.csv','w') as output: 
    reader = csv.reader(sample) 
    writer = csv.writer(output) 
    # discard input header 
    next(reader) 
    # write output header 
    writer.writerow(['col1','col2','col3']) 
    #process rows 
    for row in reader: 
     if row: 
       for stsplit in re.split(r'--', row[1]): 
        writer.writerow([row[0], stsplit, row[1]]) 


    print open('final_output.csv').read() 
+5

Я не вижу никакого регулярного выражения здесь ... –

+0

, пожалуйста, предоставьте [mcve] и сообщите нам ожидаемый результат и то, что вы получите ... –

+0

Это не считается регулярным выражением - rsplit ('-') ? – Viv

ответ

3

rsplit не является регулярным выражением, поэтому попробуйте использовать регулярное выражение.

s = """1.Cleveland-Elyria-Mentor OH--17460 
2.Dallas-Plano-Irving TX (MSAD)--19100""" 

import re 

for line in s.split('\n'): 
    match = re.search(r'(?P<state>\b\w{2}\b).*--(?P<zip>\d{5})$', line) 
    print(match.group('state'), match.group('zip')) 

Выход

OH 17460 
TX 19100 
+1

Это лучшее решение до сих пор (и тот, который я бы принял, если бы я был OP). Я рекомендую изменить 'found = re.findall (r '(\ b \ w {2} \ b). * - (\ d +) $', строка)' to 'found = re.findall (r '(? \ b \ w {2} \ b). * - (? \ d {5}) $ ', line) ', так что вы получите более точное сопоставление (состояния должны иметь только две буквы аббревиатуры, почтовые индексы должны иметь только 5 цифр), и поэтому вы получаете удобные названные группы. –

+1

Python использует '(? P ...)', а также работает подход, поэтому обновляется. –

+0

Функция группы не работает с csv writer – Viv

3

Принимая числовые значения в качестве примера:

import re 
DOUBLE_DASH ="(?<=--)\d+" 

def grab_numeric(line, pattern=DOUBLE_DASH): 
    result = re.search(pattern, line) 
    num = result.group(0) if result else None 
    return num 

with open("sample.csv") as inputs: 
    for line in inputs: 
     result = grab_numeric(line) 
     print(result) 

положить содержимое в sample.csv и код в test.py и запустить

python test.py 

Выход:

17460 
19100 

Это похоже, чтобы захватить HO и TX, просто сделать некоторые исследования самостоятельно и заменить pattern я обеспечиваю. Надеюсь, это поможет.

0

Надеюсь, я правильно вас понял: split создает список с элементами между строкой, передаваемой как сфера, rsplit делает то же самое, но сканирует с конца строки (что важно, если вы укажете maxsplit аргумент например). Для вас разница не важна, и вы можете использовать split, это создаст список элементов

['Cleveland-Elyria-Mentor OH', '17460'] 

Вы хотите 17460, это последний элемент списка, так что код нужно

fipsplit = row.split('--')[-1] 
writer.writerow(fipsplit) 
+0

Это решение работает для извлечения почтового индекса после '-', но у него будут проблемы с извлечением имени состояния потому что некоторые состояния имеют следующий текст в примере (например, 'TX (MSAD)' нужно возвращать только 'TX'). Использование наивных' str.split() 'реализаций делает это более сложным, чем использование регулярных выражений. –

+0

Конечно, я знаю это, но он написал «Попытка разбить строку по-символу и захотеть распечатать данные после ...». Именно поэтому я не был уверен, что означает OP. Если он хочет только данные после '-' который является номером, чем это решение прекрасно :) – marcinowski

+0

Это дает мне только 0 из 17460. Не давая всего 17460 – Viv

Смежные вопросы