【发布时间】:2017-04-02 06:36:43
【问题描述】:
我想在 Python 中使用正则表达式从照片说明中重建全名,方法是将姓氏附加到模式 “FirstName1 and FirstName2 LastName” 中的名字后面。我们可以依赖以大写字母开头的名称。
例如,
'John and Albert McDonald' 变为 'John McDonald' 和 'Albert McDonald'
“斯蒂芬·斯图尔特、约翰和阿尔伯特·戴蒙德” 变为 “约翰·戴蒙德” 和 “阿尔伯特·戴蒙德”
我需要避免匹配这样的模式:'Jay Smith and Albert Diamond'并生成一个不存在的名称'Smith Diamond'
照片说明在此模式之前可能有也可能没有更多文字,例如,“与 John 和 Stephen Diamond 一起度过了美好的一天。”
这是我目前的代码:
s = 'John and Albert McDonald'
so = re.search('([A-Z][a-z\-]+)\sand\s([A-Z][a-z\-]+\s[A-Z][a-z\-]+(?:[A-Z][a-z]+)?)', s)
if so:
print so.group(1) + ' ' + so.group(2).split()[1]
print so.group(2)
这将返回 'John McDonald' 和 'Albert McDonald',但 'Jay Smith and Albert Diamond' 将导致非现有名称'Smith Diamond'。
一个想法是检查模式前面是否有大写单词,例如 (?<![A-Z][a-z\-]+)\s([A-Z][a-z\-]+)\sand\s([A-Z][a-z\-]+\s[A-Z][a-z\-]+(?:[A-Z][a-z]+)?),但不幸的是,只有在我们知道前面单词的确切长度时,负向后查找才有效,我没有。
您能告诉我如何纠正我的正则表达式表达吗?还是有更好的方法来做我想做的事?谢谢!
【问题讨论】:
-
你能相信以大字母开头的名字吗?
-
这样的问题,你应该先写测试用例。
-
@Vallentin 是的,我们可以依赖以大写字母开头的名称。
-
@AshishNitinPatil 抱歉,我是 Python 新手,不太熟悉用于编写测试用例的 unittest 模块...