【发布时间】:2014-12-08 15:40:32
【问题描述】:
我正在处理一个文本文件 (620KB),其中包含一个 ID# 列表,后跟用逗号分隔的全名。 我用于此的工作正则表达式是
^([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.
【问题讨论】:
-
从文件上传一些输入数据和所需的输出。
-
您是否考虑过专门针对名字和中间名首字母的第二个或替代捕获组正则表达式?此外,如果您提供要使用的测试数据,这个问题会更容易回答。不过,我怀疑使用替代捕获组会起作用。
-
如果你的源文件是逗号分隔的,为什么不使用 csv 模块。然后只需将第二列附加到您的姓名列表中。似乎更简单,恕我直言。
-
不是每个人的名字都写成一样的,即使使用首字母也是如此。 (内)著名例子:L. Ron Hubbard、F. Scott Fitzgerald、M. Night Shyamalan、L. Sprague de Camp。
-
@LuisFelipe,您提供的示例数据是您的正则表达式应该搜索的格式吗?我怀疑不是,因为您的模式明确搜索新行的开头。请确保您的源样本格式相同。这对于模式的准确性至关重要。
标签: python regex database list python-3.x