使用Python正则表达式检测照片标题中的伴侣

时间:2017-09-15 02:38:07

标签: python regex web-scraping

我正在进行网络抓取项目,我正试图从一系列照片标题中提取名称。我将标题存储为unicode字符串列表,例如:

Phil Collins, with Beth and Jerry Smith

我已经能够使用foo = re.compile(r" +with +|, +and +| +and +|, +")re.split(foo)将字幕分成不同的名称,例如:

['Phil Collins', 'Beth', 'Jerry Smith']

不幸的是,我很难找到一种方法来分析Jane和Jerry Smith(我是正则表达式的新手),这种方式可以检测他们的姓氏并产生输出:

['Phil Collins', 'Beth Smith', 'Jerry Smith']

我能够使用Beth and Jerry Smith检测re.compile(r"[A-Z][a-z]+ +and +[A-Z][a-z]+ +[A-Z][a-z]+",但我不确定检测到它后处理它的最佳方法。

我要解决的问题是,我需要遍历名单,检测'Beth'不是全名,读'Jerry Smith',最后阅读并将'Smith'追加到'Beth “给我一份完整的清单:['Phil Collins','Beth Smith','Jerry Smith']

re中是否有一个方法可以将匹配的子字符串传递给函数,以便我可以修改它以包含Beth的姓氏?或者我是否正确地解决了这个问题?

1 个答案:

答案 0 :(得分:0)

您可以使用re.split和所有可能分隔符的较小RegEx来分割文本,而不是使用复杂的RegEx搜索名称和分隔符。

在这里,我看到的分隔符是:","和"和" (开头和结尾都有空格)。您可以通过加入每个分隔符来创建RegEx。

import re

text = "Phil Collins, with Beth and Jerry Smith"

delimiters = [r",\s+with\s+", "\s+and\s+"]
regex = "|".join(delimiters)
print(re.split(regex, text, flags=re.IGNORECASE))
# -> ['Phil Collins', 'Beth', 'Jerry Smith']

修改

加入" Beth"与#34;史密斯"和杰瑞"使用" Smith",您需要首先拆分"使用",然后拆分并使用&。

import re

text = "Phil Collins, with Beth and Jerry Smith"

for part in re.split(",\s+with\s+", text):
    first, last = re.findall(r"(\w+(?:\s+and\s+\w+)?)\s+(\w+)",
                             part, flags=re.UNICODE)[0]
    names = re.split(r"\s+and\s+", first)
    result = [name + " " + last
              for name in names]
    print(result)

你得到:

['Phil Collins']
['Beth Smith', 'Jerry Smith']