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)
用于匹配所有 A
的 not 后跟 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}
- 两位数
.*
- 字符串的所有其余部分。
我想将 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)
用于匹配所有 A
的 not 后跟 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}
- 两位数
.*
- 字符串的所有其余部分。