regex 删除第二个插入符号正则表达式之后的所有内容,并应用于panda Dataframe 列

djmepvbi  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(79)

我有一个 Dataframe ,其中的列如下所示:

0         EIAB^EIAB^6
1           8W^W844^A
2           8W^W844^A
3           8W^W858^A
4           8W^W844^A
             ...     
826136    EIAB^EIAB^6
826137    SICU^6124^A
826138    SICU^6124^A
826139    SICU^6128^A
826140    SICU^6128^A

我只想保留第二个插入符号之前的所有内容,例如:8W^W844,在Python中我应该用什么正则表达式,类似的,PACU^SPAC^06应该是PACU^SPAC,然后把它应用到整列。
我尝试了r'[\\^].+$',因为我认为它会采取最后一个脱字符和一切之后,但它没有工作。

ulydmbyx

ulydmbyx1#

您可以对字符组求反以查找除^之外的所有内容,并将其放入匹配组中。您不需要对字符组中的^进行转义,但需要对字符组外的^进行转义。

re.match(r"([^^]+\^[^^]+)", "8W^W844^A").group(1)

这在panda Dataframe 中非常有用,假设你想在一个列上做这个,你可以提取你想要的字符串

df['col'].str.extract(r'^([^^]+\^[^^]+)', expand=False)
    • 注**

最初,我使用replace,但评论中建议的extract解决方案在1/4的时间内执行。

import pandas as pd
import numpy as np
from timeit import timeit

df = pd.DataFrame({"foo":np.arange(1_000_000)})
df["bar"] = "8W^W844^A"
df2 = df.copy()

def t1():
    df.bar.str.replace(r"([^^]+\^[^^]+).*", r"\1", regex=True)
    
def t2():
    df.bar.str.extract(r'^([^^]+\^[^^]+)', expand=False)

print("replace", timeit("t1()", globals=globals(), number=20))
print("extract", timeit("t2()", globals=globals(), number=20))

输出

replace 39.73989862400049
extract 9.910304663004354
y53ybaqx

y53ybaqx2#

我不认为这里真的需要regex,只需要将字符串分割到第二个插入符号的位置:

>>> s = 'PACU^SPAC^06'
>>> s[:s.find("^", s.find("^") + 1)]
'PACU^SPAC'
  • 说明 *:str.find接受从何处开始搜索的第二个参数,将其放在第一个插入符号的位置之后。

相关问题