python - 正则表达式:匹配特定模式,如果匹配在特定上下文中则排除

标签 python regex pandas

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

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”将替换为“ü”。但这行不通,那么该怎么办呢?提前致谢。

最佳答案

您可以使用

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 组:aou AOU,然后是 e

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

关于python - 正则表达式:匹配特定模式,如果匹配在特定上下文中则排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51982073/

相关文章:

python - 编解码器模块无法读取文本文件

python - 使用 OAuth2WebServerFlow 的多个范围

javascript - 查找和替换双引号之间的换行符

javascript - 如何将字符串拆分为 ',' 或 '[|]',除非 ',' 在 '{}' 中

python - 从不等长的嵌套列表创建 Pandas 数据框

python - 如何比较 django 中不相等的邮政编码列表中的值?

python - 如何使用 MongoEngine 根据特定条件选择多个对象?

JavaScript - 仅解析 URL 的一部分,但不解析指定位置之后的所有内容

Python Pandas 如何根据相似的列加入 2 个或更多数据框

python - Pandas :获取最小列的名称