说我有这个数据框:
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
结尾。
答案 0 :(得分:2)
您可以使用\w*?
来匹配最少的字符,然后在组1中捕获与可选的A匹配,然后匹配BC (A?BC)
,然后匹配单词边界。
\w*?(A?BC)\b
其中有替换使用组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
$
-字符串的结尾。