正则表达式从列表中提取名称

时间:2014-12-08 15:40:32

标签: python regex database list python-3.x

我正在处理一个文本文件(620KB),其中包含ID#s列表,后跟用逗号分隔的全名。 我用过的工作正则表达式是

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

我还要捕获名字和中间名首字母(第一个和MI之间的空格分隔符)。 我试过这样做:

^([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 
ABC1200123123 de la Rosa, Maria E.

1 个答案:

答案 0 :(得分: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

基本上,正向前瞻确保在模式结束后直接存在换行符(在本例中为行尾)。它会匹配,但不会捕获实际的行尾。