2014-12-08 3 views
0

Я работаю с текстовым файлом (620 КБ), который имеет список ID # s, за которым следуют полные имена, разделенные запятой. Рабочего регулярное выражение я использовал для этогоRegex для извлечения имени из списка

^([A-Z]{3}\d+)\s+([^,\s]+) 

Я хочу также захватить имя и отчество (пробел разделителя между первым и ИМ). Я попробовал это, выполнив:

^([A-Z]{3}\d+)\s+([^,\s]+([\D])+) 

, который работает, но я хочу, чтобы удалить новый разрыв строки, который генерируется на выходном файле (я буду импортировать два выходных файла в базу данных (возможно, Access) и Я не хочу, чтобы захватить новые разрывы строк, а также, если есть лучший способ написания регулярных выражений

Полный код:

import re 

source = open('source.txt') 
ticket_list = open('ticket_list.txt', 'w') 
id_list = open('id_list.txt', 'w') 

for lines in source: 
    m = re.search('^([A-Z]{3}\d+)\s+([^\s]+([\D+])+)', lines) 
    if m: 
     x = m.group() 
     print('Ticket: ' + x) 
     ticket_list.write(x + "\n") 
ticket_list = open('First.txt', 'r') 
for lines in ticket_list: 
    y = re.search('^(\d+)\s+([^\s]+([\D+])+)', lines) 
    if y: 
     z = y.group() 
     print ('ID: ' + z) 
     id_list.write(z + "\n") 
source.close() 
ticket_list.close() 
id_list.close() 

Пример данных: Источник:

ABC1000033830 SMITH, Z 
100000012 Davis, Franl R 
200000655 Gest, Baalio 
DEF4528942681 PACO, BETH 
300000233 Theo, David Alex 
400000012 Torres, Francisco B. 
ABC1200045682 Mo, AHMED 
DEF1000006753 LUGO, G TO 
ABC120de la Rosa, Maria E. 
+2

Загрузите некоторые входные данные из файла и требуемого вывода. –

+2

Вы рассматривали второе или альтернативное регулярное выражение группы захвата для конкретного имени и среднего начального? Кроме того, на этот вопрос будет легче ответить, если вы предоставили тестовые данные для использования. Я подозреваю, что использование альтернативной группы захвата будет работать. –

+1

Если ваш исходный файл разделен запятой, почему бы не использовать модуль csv. затем просто добавьте второй столбец в список имен. Кажется, проще, имхо. –

ответ

0

В зависимости от того, с какими линиями вы сталкиваетесь, простой позитивный взгляд может исправить ваш шаблон, захватив результат в результате. Это было создано RegexBuddy 4.2.0 и работало со всеми вашими тестовыми данными.

if re.search(r"^([A-Z]{3}\d+)\s+([^,\s]+([\D])+)(?=$)", subject, re.IGNORECASE | re.MULTILINE): 
    # Successful match 
else: 
    # Match attempt failed 

В основном, положительный предпросмотр убеждается, что есть перевод строки (в данном случае, конец строки) символов непосредственно после того, как картина заканчивается. Он будет соответствовать, но не фиксирует фактический конец строки.

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