我正在做一个网络抓取项目,在那里我试图从一系列图片标题中提取名字。我将标题存储为unicode字符串列表,如:
Phil Collins, with Beth and Jerry Smith
我已经能够使用foo = re.compile(r" +with +|, +and +| +and +|, +")和re.split(foo)将标题划分为不同的单独名称,如:
['Phil Collins', 'Beth', 'Jerry Smith']
不幸的是,我很难找到一种将Jane和曾傑瑞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]+",但我不确定检测到后处理它的最佳方法是什么。
我想解决的问题是,我需要反复检查名单,发现“贝丝”不是全名,读“曾傑瑞史密斯”,最后把“史密斯”读到“贝丝”,给我一个完整的列表:“菲尔·柯林斯”、“贝丝·史密斯”、“曾傑瑞史密斯”。
在re中是否有一种方法可以将匹配的子字符串输送到一个函数,以便我可以修改它以包含贝丝的姓氏?还是我用正确的方式处理这个问题?
发布于 2017-09-15 02:56:15
与使用复杂的RegEx搜索名称和分隔符不同,您可以使用re.split和所有可能的分隔符的较小的RegEx来拆分文本。
在这里,我看到的分隔符是:",with“和" and”(空格在开始和结束)。您可以通过连接每个分隔符来创建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']编辑
要加入“贝丝”与“史密斯”,“曾傑瑞”与“史密斯”,你需要先分裂的“与”,然后分裂的和。
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']https://stackoverflow.com/questions/46230878
复制相似问题