Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式从列表中提取名称_Python_Regex_Database_List_Python 3.x - Fatal编程技术网

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

Python 正则表达式从列表中提取名称,python,regex,database,list,python-3.x,Python,Regex,Database,List,Python 3.x,我正在处理一个620KB的文本文件,它有一个ID列表,后面是用逗号分隔的全名。 我在这里使用的工作正则表达式是 ^([A-Z]{3}\d+)\s+([^,\s]+) 我还想捕获first和MI之间的名字和中间的初始空格分隔符。 我试着这样做: ^([A-Z]{3}\d+)\s+([^,\s]+([\D])+) 这是可行的,但我想删除在输出文件上生成的新行分隔符。我将把两个输出文件导入一个数据库(可能是Access),我不想捕获新行分隔符,如果还有更好的方法编写正则表达式 完整代码: impo

我正在处理一个620KB的文本文件,它有一个ID列表,后面是用逗号分隔的全名。 我在这里使用的工作正则表达式是

^([A-Z]{3}\d+)\s+([^,\s]+)
我还想捕获first和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.

根据您正在处理的换行符类型,简单的积极前瞻可能会纠正在结果中捕获换行符的模式。这是由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

基本上,正向前瞻确保在本例中有换行符,即模式结束后的行尾字符。它将匹配,但不会捕获实际的行尾。

从文件中上载一些输入数据和所需的输出。您是否考虑过第二个或其他捕获组正则表达式,特别是第一个名称和中间首字母?此外,如果您提供测试数据以供使用,那么这个问题将更容易回答。不过,我怀疑使用另一个捕获组是可行的。如果源文件是逗号分隔的,为什么不使用csv模块呢。然后只需将第二列附加到您的姓名列表中。看起来简单多了,伊姆霍。不是每个人的名字都写得一样,即使是用首字母。在著名的例子中:L.Ron Hubbard,F.Scott Fitzgerald,M.Night Shyamalan,L.Sprague de Camp.@LuisFelipe,您提供的示例数据是您的正则表达式应该搜索的格式吗?我怀疑不是,因为您的模式显式地搜索新行的开头。请确保源样本的格式相同。这对于图案的准确性至关重要。