【问题标题】:Regex in Python: How to match a word pattern, if not preceded by another word of variable length?Python中的正则表达式:如果前面没有另一个可变长度的单词,如何匹配单词模式?
【发布时间】: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 模块...

标签: python regex


【解决方案1】:

由于您可以依赖以大写字母开头的名称,因此您可以执行以下操作:

((?:[A-Z]\w+\s+)+)and\s+((?:[A-Z]\w+(?:\s+|\b))+)

Live preview

换出你当前的模式,这个模式应该适用于你当前的 Python 代码。 您确实需要strip() 捕获的结果。

您的示例和当前代码会产生以下结果:

Input
First print
Second print

John and Albert McDonald
John McDonald
Albert McDonald

Stephen Stewart, John and Albert Diamond
John Diamond
Albert Diamond

It was a great day hanging out with John and Stephen Diamond.
John Diamond
Stephen Diamond

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多