【问题标题】:How to extract a human name in a string python如何在字符串python中提取人名
【发布时间】:2022-01-07 14:21:33
【问题描述】:

我有一个 OCR 图像中的字符串,我需要找到一种方法来从中提取人名。 OCR 需要here is the image,结果如下:

From: Al Amri, Salim <salim.amri@gmail.com>

Sent: 25 August 2021 17:20

To: Al Harthi, Mohammed <mohd4.king@rihal.om>

Ce: Al hajri, Malik <hajri990@ocaa.co.om>; Omar, Naif <nnnn49@apple.com>

Subject: Conference Rooms Booking Details

Dear Mohammed,

As per our last discussion these are the available conference rooms available for booking along
with their rates for full day:

Room: Luban, available on 26/09/2021. Rate: $4540

Room: Mazoon, available on 04/12/2021 and 13/02/2022. Rate: $3000
Room: Dhofar. Available on 11/11/2021. Rate: $2500

Room: Nizwa. Available on 13/12/2022. Rate: $1200

   

Please let me know which ones you are interested so we go through more details.
Best regards,

Salim Al Amri

标题中一共有4个名字,我需要得到输出:

names = 'Al Hajri, Malik', 'Omar, Naif', 'Al Amri, Salim', 'Al Harthy, Mohammed' #desired output

但我不知道如何提取名称。我已经尝试过 RegEx 并想出了:

names = re.findall(r'(?i)([A-Z][a-z]+[A-Z][a-z][, ] [A-Z][a-z]+)', string) #regex to find names

搜索一个大写字母,然后是逗号,然后是另一个以大写字母开头的单词。它接近预期的结果,但结果如下:

names = ['Amri, Salim', 'Harthi, Mohammed', 'hajri, Malik', 'Omar, Naif', 'Luban, available', 'Mazoon, available'] #acutal result

我曾想过可能使用另一个字符串来提取房间名称并将它们从列表中排除,但我不知道如何实现这个想法。我是 RegEx 的新手,因此我们将不胜感激。提前谢谢

【问题讨论】:

  • 对于您的人名提取器,它是否仅用于符合上述格式的输入?如果是这样,RegEx 就是要走的路。如果没有,这将成为一个更难的问题。
  • 如果您可以保证标头将包含电子邮件,一个想法是查找出现在 <...> 表达式(电子邮件地址)旁边的任何内容
  • @BenGrossmann 是的,它总是在电子邮件旁边。我会尝试并分享结果。谢谢
  • "搜索一个大写字母,然后是一个逗号,然后是另一个以大写字母开头的单词",因此对于van Gogh, Vincent,它无法正常工作
  • @ibarrond 是的,它只会用于相同的输入

标签: python regex pycharm ocr


【解决方案1】:

尽管@JvdV 建议了出色的 RE 方法,但您可以通过以下分步方式实现这一目标:

OCR = """From: Al Amri, Salim <salim.amri@gmail.com>

Sent: 25 August 2021 17:20

To: Al Harthi, Mohammed <mohd4.king@rihal.om>

Ce: Al hajri, Malik <hajri990@ocaa.co.om>; Omar, Naif <nnnn49@apple.com>

Subject: Conference Rooms Booking Details

Dear Mohammed,

As per our last discussion these are the available conference rooms available for booking along
with their rates for full day:

Room: Luban, available on 26/09/2021. Rate: $4540

Room: Mazoon, available on 04/12/2021 and 13/02/2022. Rate: $3000
Room: Dhofar. Available on 11/11/2021. Rate: $2500

Room: Nizwa. Available on 13/12/2022. Rate: $1200

   

Please let me know which ones you are interested so we go through more details.
Best regards,

Salim Al Amri"""

names = []
for line in OCR.split('\n'):
    tokens = line.split()
    if tokens and tokens[0] in ['From:', 'To:', 'Ce:']: # Ce or Cc ???
        parts = line.split(';')
        for i, p in enumerate(parts):
            names.append(' '.join(p.split()[i==0:-1]))
print(names)

【讨论】:

  • 非常感谢。只是为了详细说明 Ce 或 CC 注释,OCR 将其读取为 Ce 而不是 Cc。理论上我可以通过放大文本来解决这个问题,但由于它不会影响其余代码,所以我就这样离开了。
【解决方案2】:

根据您的电子邮件内容,一个合理的方法可能是使用:

[:;]\s*(.+?)\s*<

在线查看demo

  • [:;] - 一个(半)冒号;
  • \s* - 0+(贪婪)空格;
  • (.+?) - 第一个捕获组 1+(惰性)字符;
  • \s* - 0+(贪婪)空格;
  • &lt; - 文字“

请注意,我专门使用 (.+?) 来捕获名称,因为众所周知,名称很难匹配。


import re
s = """From: Al Amri, Salim <salim.amri@gmail.com>

Sent: 25 August 2021 17:20

To: Al Harthi, Mohammed <mohd4.king@rihal.om>

Ce: Al hajri, Malik <hajri990@ocaa.co.om>; Omar, Naif <nnnn49@apple.com>

Subject: Conference Rooms Booking Details

Dear Mohammed,

As per our last discussion these are the available conference rooms available for booking along
with their rates for full day:

Room: Luban, available on 26/09/2021. Rate: $4540

Room: Mazoon, available on 04/12/2021 and 13/02/2022. Rate: $3000
Room: Dhofar. Available on 11/11/2021. Rate: $2500

Room: Nizwa. Available on 13/12/2022. Rate: $1200

   

Please let me know which ones you are interested so we go through more details.
Best regards,

Salim Al Amri"""
print(re.findall(r'[:;]\s*(.+?)\s*<', s))

打印:

['Al Amri, Salim', 'Al Harthi, Mohammed', 'Al hajri, Malik', 'Omar, Naif']

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2013-09-06
    • 2011-01-28
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多