【发布时间】: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