【问题标题】:Regex solution to {First_name and First_name Last_name} pattern:{First_name and First_name Last_name} 模式的正则表达式解决方案:
【发布时间】:2019-09-24 18:24:45
【问题描述】:

我认为,以下内容应用了 Python 中使用的正则表达式。如果在正则表达式之外还有其他方法可以做到这一点,我愿意接受。

我需要转成这种格式的字符串:

'{First_name1} and {First_name2 Last_name}'

    (i.e. John and Mary Jones)

收件人:

'{First_name1 Last_name2}, {First_name2 Last_name2} 

    (i.e. John Jones, Mary Jones)

对正则表达式不熟悉,这是一种让我感到困惑的模式。我假设我必须找到整个段的实例,捕获姓氏,然后使用 .sub() 在正确的位置添加副本?

编辑:虽然到目前为止提出的解决方案确实回答了这个问题,但我想我会提到我发现了另一种情况,到目前为止,这些解决方案正在被解决。也就是:

{First_name1 Last_name1, and First_name2, Last_name2}

很抱歉之前没有看到(因此,写在我原来的问题中)这种模式。

到目前为止,我已经修改了其中一个答案:

([^,]+)(?!\W,)( and [^ ]+ )([^ ]+)

我想我会在最后一个示例中根据逗号进行过滤。我的想法是,如果逗号存在,那么我想继续下一个案例。这有意义吗?

【问题讨论】:

  • 您需要定义什么是“名字”和“姓氏”。您假设每个名称只有一个单词,但情况可能并非如此。如果你有玛丽安萨默斯怎么办?名字有两个词。如果你有埃迪范海伦怎么办?姓氏有两个词。
  • @AndyLester - First_name 和 Last_name 分别是单个单词。正如您所提到的,存在中间名、两个词的名字或姓氏(连字符、撇号等)的情况,但为了这种情况,这些是我可以跳过正则表达式的边缘情况。
  • 这就是我想出的:(?!\s)(\W[^\W,]+)(?!,)( and [^ ]+ )([^ ]+)。不确定它是否适用于上面详述的每个案例,但在我正在查看的小数据集上,它似乎还可以。
  • 现在停止编写代码。退一步描述你试图解析的字符串,最好使用像 BNF 这样的符号。收集要解析的各种字符串的列表,并验证您的 BNF 是否与它们匹配。然后将您的 BNF 转换为解析器、正则表达式或其他任何东西。对有机进化的正则表达式的增量刺伤/戳是下降到正则表达式的地狱。

标签: regex python-3.x text-parsing


【解决方案1】:

如果您的数据始终采用这种格式,那么我可以看到不需要执行正则表达式,您可以简单地拆分字符串并使用索引以您需要的格式构造您想要的名称:

a = 'John and Mary Jones'
a_split = a.split()
[(a_split[0], a_split[-1]), (a_split[-2], a_split[-1])]

结果

[('John', 'Jones'), ('Mary', 'Jones')]

【讨论】:

  • 只是添加,您可以通过在示例中添加join 来组合它们:[' '.join(a_split[0], a_split[-1]), ...]。结果为'John Jones' 而不是('John', 'Jones')
【解决方案2】:

就您的确切输入示例而言,您可以使用:

([^ ]+)( and [^ ]+ )([^ ]+)

https://regex101.com/r/HkMiWi/1

【讨论】:

    【解决方案3】:

    在@MonkeyZeus 的帮助下,这成功了:

    (?!\s)(\W[^\W,]+)(?!,)( and [^ ]+ )([^ ]+)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      相关资源
      最近更新 更多