Skip to main content
 首页 » 编程设计

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

2024年09月07日28fff_TT

我是正则表达式的初学者,想问问你们如何用正则表达式解决这个问题。目前我正在尝试预处理德语文本。德语在其字母表中有一些特定字符(ä、ö、ü)。然而,这些字母也可以用不同的方式书写(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 - A, a, Ä, ä , E 或 e 后跟 ue 子串
  • | - 或者
  • ([aouAOU]e) - 第 1 组:a、o、u、 A、O 或 U 然后是 e

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