Pandas 字符串匹配否定先行不起作用

Pandas string match negative lookahead not working

我想将 Pandas 数据框中所有与所需格式不匹配的值设置为 NaN。

不需要的格式示例:

代码

df['Anfang L1'] = df['Anfang L1'].str.replace(r'(?!\D{3}.\d{2})', '')

正则表达式在没有否定前瞻的情况下工作。 正则表达式也适用于 str.match 函数中的负前瞻。

df[df['Anfang L1'].str.match('(?!\D{3}.\d{2})')]

谢谢大家的帮助。

PS: 我也试过以下

df['Anfang L1'].replace(to_replace=r'(?!\D{3}.\d{2})', value='new', inplace=True)

问题出在正则表达式的定义上。

A Negative Lookahead A(?!B) 用于匹配所有 Anot 后跟 B.

最后的objective就是将所有不匹配\D{3}\.\d{2}的条目设置为NaN

一种方法,

# Get a `series` of values which is true if it matches my format
match_my_correct_format = df['Anfang L1'].str.contains(r'\D{3}\.\d{2}')

# Set all rows which don't match my format to null
df[~match_my_correct_format] = np.nan

您可以使用

df['Anfang L1'].replace([r'^\d{2}\.\d{4}$'], np.nan, regex=True, inplace=True)

如果您需要匹配除 ^\D{3}\.\d{2}$ 以外的所有模式,请使用

df['Anfang L1'].replace([r'^(?!\D{3}\.\d{2}$).*'], np.nan, regex=True, inplace=True)

^\d{2}\.\d{4}$ 模式匹配

  • ^ - 字符串开头
  • \d{2} - 两位数
  • \. - 一个点
  • \d{4} - 四位数
  • $ - 字符串结尾

另一种模式表示:

  • ^ - 字符串开头
  • (?!\D{3}\.\d{2}$) - 就在那里,到最后,不应该有
    • \D{3} - 三个非数字字符
    • \. - 一个点
    • \d{2} - 两位数
  • .* - 字符串的所有其余部分。