【问题标题】:Regex: Match a specific pattern, exclude if match is in a specific context正则表达式:匹配特定模式,如果匹配在特定上下文中则排除
【发布时间】:2018-08-23 09:06:06
【问题描述】:

我是正则表达式的初学者,想问一下如何用正则表达式解决这个问题。目前我正在尝试预处理德语文本。德语的字母表中有一些特定的字符(ä、ö、ü)。然而,这些字母也可以用不同的方式书写(ae、oe、ue)。所以我只是使用了替换方法,效果很好。

import pandas as pd
df = pd.DataFrame({"text": ["Uebergang", "euer"]})
df["text"] = df["text"].str.replace("ae", "ä")
df["text"] = df["text"].str.replace("Ae", "Ä")
df["text"] = df["text"].str.replace("oe", "ö")
df["text"] = df["text"].str.replace("Oe", "Ö")
df["text"] = df["text"].str.replace("ue", "ü")
df["text"] = df["text"].str.replace("Ue", "Ü")

但也有不应该发生替换的特定模式。就像“euer”这个词一样。在这篇文章的帮助下,我尝试制作一个有效的正则表达式:Regex Pattern to Match, Excluding when... / Except between

df["text"] = df["text"].str.replace("[AaÄäEe]ue|(ue)", "ü")

因此,如果括号 [AaÄäEe] 中有任何字符,然后是“ue”,那么我想排除这些情况。否则“ue”将被“ü”代替。但这不起作用,那你怎么做呢?提前致谢。

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    你可以使用

    import re
    import pandas as pd
    dct = {'ae' : 'ä', 'Ae' : 'Ä', 'oe' : 'ö', 'Oe' : 'Ö', 'ue' : 'ü', 'Ue' : 'Ü'}
    df = pd.DataFrame({"text": ["Uebergang", "euer"]})
    df['text'].str.replace(r'[AaÄäEe]ue|([aouAOU]e)', lambda x: dct[x.group(1)] if x.group(1) else x.group())
    # => 0    Übergang
    #    1        euer
    #    Name: text, dtype: object
    

    [AaÄäEe]ue|([aouAOU]e) 模式匹配:

    • [AaÄäEe]ue - AaÄäEe 后跟 ue 子字符串
    • | - 或
    • ([aouAOU]e) - 第 1 组:aouAOU,然后是 e

    lambda x: dct[x.group(1)] if x.group(1) else x.group() lambda 表达式执行以下操作:一旦第 1 组匹配,dct[x.group(1)] 将返回替换字符串。否则,找到的匹配将被粘贴回来。

    【讨论】:

    • 非常感谢您的回答。这似乎解决了我的问题并缩短了我编写的代码。
    【解决方案2】:

    应该做的伎俩:

    df["text"] = df["text"].str.replace("[^AaÄäEe](ue)", "ü")
    

    '^' 表示不在正则表达式中

    【讨论】:

    • 感谢您的回答。如果我使用“Stueck”这个词,它会将“tue”替换为“ü”。但我只想替换“ue”部分。当“ue”之前有特定字符(括号中的字符)时,我想排除这些匹配项。因此应排除“Aue”、“aue”、“Äue”、“äue”、“Eue”、“eue”的组合,否则将“ue”替换为“ü”。
    • 使用否定的后视:(?<![AaÄäEe])ue
    • @AhmedAbdelhameed 非常感谢您的回答。我喜欢这两种解决方案(你的和来自@WiktorStribiżew)。让我更深入地了解正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多