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

时间:2018-08-23 09:06:07

标签: python regex pandas

我是regex的初学者,想问一下如何使用regex解决此问题。目前,我正在尝试预处理德语文本。德语的字母中有一些特定的字符(ä,ö,ü)。但是,这些字母也可以用其他方式(ae,oe,ue)书写。所以我只是使用了replace方法,效果很好。

1086H     014CH                  *** GAP ***

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

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", "Ü")

因此,如果括号[AaÄäEe]中包含任何字符,并且之后出现“ ue”,那么我想排除这些情况。否则,“ ue”将被替换为“ü”。但这是行不通的,那你怎么办呢?预先感谢。

2 个答案:

答案 0 :(得分:1)

应该做到这一点:

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

“ ^”表示不在正则表达式中

答案 1 :(得分: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,后跟{{1} }子字符串
  • ue-或
  • |-第1组:([aouAOU]e)aouAO,然后{ {1}}

U lambda表达式执行以下操作:组1匹配后,e将返回替换字符串。否则,找到的匹配项将被粘贴回去。