如何在Python中从同一字符串中提取多个名称

如何在Python中从同一字符串中提取多个名称,python,pandas,string,web-scraping,Python,Pandas,String,Web Scraping,我正在抓取数据并解析出字符串中的名称。例如,我使用的字符串类似于以下内容: Sharif Amlani博士,UC戴维斯健康,Joe Biden博士,UC旧金山,艾尔顿·约翰博士,戴维斯县公共卫生主任/ /P> 及 代码>来自UC旧金山的温斯顿Bishop和来自UC旧金山的UsAIN Boo. 是否有代码将这些文本转换成数据集 因此,数据如下所示: Name Affiliation Sharif Amlani UC Davis Health Joe Biden

我正在抓取数据并解析出字符串中的名称。例如,我使用的字符串类似于以下内容:

<代码> Sharif Amlani博士,UC戴维斯健康,Joe Biden博士,UC旧金山,艾尔顿·约翰博士,戴维斯县公共卫生主任/<代码> /P> 及

<>代码>来自UC旧金山的温斯顿Bishop和来自UC旧金山的UsAIN Boo.<代码>

是否有代码将这些文本转换成数据集

因此,数据如下所示:

   Name           Affiliation
Sharif Amlani   UC Davis Health
Joe Biden       UC San Francisco
Elton John      Public Health Director for Davis County
Winston Bishop  UC San Francisco
Usain Bolt      UC San Francisco

谢谢

以下是此示例文本的axample代码:

text = "\
Sharif Amlani   UC Davis Health\n\
Joe Biden       UC San Francisco\n\
Elton John      Public Health Director for Davis County\n\
Winston Bishop  UC San Francisco\n\
Usain Bolt      UC San Francisco"

lines = text.split('\n')
df = pd.concat([pd.DataFrame([[line[0:16].strip(),line[16:].strip()]]) for line in lines])

如果字符串的格式始终为
name from place和name from place
,则可以执行以下操作:

将熊猫作为pd导入
#您的格式一致的字符串
S=“温斯顿博士,来自UC旧金山的毕肖普,来自旧金山UC的乌塞恩博尔特”
l=list()#一个用来跟踪数据的列表-我相信有更好的方法可以做到这一点
对于s.split('and')中的行:#每行看起来像“来自从属关系的名称”
#l=[(姓名、隶属关系),…]
l、 追加(n.split((n.strip()表示行中的n.split('from'))
#然后创建数据帧
df=pd.DataFrame(data=l,columns=['Name','Affiliation'])
#您可能希望使用一个lambda表达式,使用pandas DataFrame剥离名称和从属关系

在抓取过程中,一切都归结为模式匹配。如果字符串格式不一致,可能会非常痛苦。不幸的是,在您的情况下,情况似乎就是这样。因此,我建议您根据具体情况进行处理

我可以观察到这样一种模式,除了一个例外,所有的名字都以“Dr”开头。你可以用它来用正则表达式提取名字

import re

text = "Dr. Sharif Amlani, UC Davis Health, Dr. Joe Biden, UC San Francisco, and Dr. Elton John, Public Health Director for Davis County"

regex = '((Dr.)( [A-Z]{1}[a-z]+)+)' # this will return three groups of matches

names = [match[0] for match in re.findall(regex, text)] #simply extracting the first group of matches, which is the name

您可以将其应用于其他字符串,但如上所述,它的局限性在于它只捕获以“Dr.”开头的名称。您也可以对从属关系使用类似的策略。请注意,“”分隔名称和从属关系,因此我们可以使用它

import re

text = "Dr. Sharif Amlani, UC Davis Health, Dr. Joe Biden, UC San Francisco, and Dr. Elton John, Public Health Director for Davis County"

affiliations = [term for term in text.split(',') if 'Dr.' not in term] # splitting the text by a comma and then excluding results that contain a 'Dr.'

同样,您必须根据特定文本定制解决方案,但希望这有助于您思考问题。最后,您可以使用pandas将结果合并到数据框中:

import pandas as pd

data = pd.DataFrame(list(zip(names, affiliations)), columns = ['Name', 'Affiliation'])


您可以进行正则表达式匹配并创建df。此处显示一个字符串的示例方法:

text = "Dr. Sharif Amlani, UC Davis Health, Dr. Joe Biden, UC San Francisco, and Dr. 
Elton John, Public Health Director for Davis County"
text = text.replace(', and' ,',')

re.findall("([\w\s]+),([\w\s]+)",text)
df = pd.DataFrame(r)
df.columns = ("Name", "Affiliation")
print(df)
输出:

           Name                               Affiliation
0   Sharif Amlani                           UC Davis Health
1       Joe Biden                          UC San Francisco
2      Elton John   Public Health Director for Davis County

要将这些内容刮除并转换为表格数据,您必须在行或文本和字符中找到一些规格。例如,如果您始终知道名称是行的前50个字符,请将其修剪以放入名称列,并将其作为从属关系。是的,我能够使用名称在网站上的位置提取名称。它正在尝试清除n名称并将其添加到具有挑战性的数据集中。