熊猫用正则表达式str.replace()

时间:2020-05-07 08:54:06

标签: python regex string pandas

说我有这个数据框:

df = pd.DataFrame({'Col': ['DDJFHGBC', 'AWDGUYABC']})

我想用ABC替换所有以ABC结尾的内容,并用BC替换所有以ABC结尾的内容(BC格除外)。输出如下:

    Col
0   BC
1   ABC

如何使用正则表达式实现这一目标?我已经尝试过类似的事情:

df.Col.str.replace(r'\w*BC\b', 'BC')
df.Col.str.replace(r'\w*ABC\b', 'ABC')

但是很明显,这两行是冲突的,我将以使用它们的任何顺序仅以BC结尾。

3 个答案:

答案 0 :(得分:2)

您可以使用\w*?来匹配最少的字符,然后在组1中捕获与可选的A匹配,然后匹配BC (A?BC),然后匹配单词边界。

\w*?(A?BC)\b

Regex demo

其中有替换使用组1

df.Col.str.replace(r'\w*?(A?BC)\b', r'\1')

答案 1 :(得分:1)

怎么样?

df.Col.str.replace(r'\w*ABC\b', 'ABC_').str.replace(r'\w*BC\b', 'BC').str.replace(r'\w*ABC_\b', 'ABC')

首先将\w*ABC\b替换为ABC_ABC_不会受到replace(r'\w*BC\b', 'BC')的影响。

然后将ABC_替换为ABC,以将字符串转换回原始字符串。

答案 2 :(得分:1)

您可以使用replace解决方案,例如:

df['Col'].str.replace(r'(?s)^.*?(A?BC)$', r'\1')
# 0     BC
# 1    ABC

在这里,(?s).*?(A?BC)$个匹配项

  • (?s)-一个.将与包括换行符在内的所有字符匹配
  • ^-字符串的开头
  • .*?-任意0个以上的字符,尽可能少
  • (A?BC)-第1组(在替换模式中称为\1):可选的A然后是BC
  • $-字符串的结尾。