如何在熊猫中用单个句点和问号替换".."和"?."?df['column'].str.replace 不起作用



这是本SO文章的后续内容,该文章提供了替换字符串列中文本的解决方案

如何替换Pandas数据帧的列中的文本?

df['range']=df['range'].str.replace(',','-'(

然而,这似乎不适用于双句点或问号后面跟着句点

testList = ['this is a.. test stence', 'for which is ?. was a time']
testDf = pd.DataFrame(testList, columns=['strings'])
testDf['strings'].str.replace('..', '.').head()

中的结果

0     ...........e
1    .............
Name: strings, dtype: object

testDf['strings'].str.replace('?.', '?').head()

中的结果

error: nothing to repeat at position 0

添加regex=False参数,因为正如您在文档中看到的,regex默认为True:

-regexbool,默认True

确定是否假定传入的模式是正则表达式:如果为True,则假定传入的模式是正则表达式。

? .是正则表达式中的特殊字符
因此,在没有regex的情况下,一种方法是双重替换:

testDf['strings'].str.replace('..', '.',regex=False).str.replace('?.', '?',regex=False)

输出:

strings
0     this is a. test stence
1  for which is ? was a time

使用正则表达式替换。在这种情况下,请替换任何单独的字符">">'后面紧跟空白。这有点卷曲,我建议你用@Mark Reed的答案。

testDf.replace(regex=r'([.](?=s))', value=r'')

strings
0     this is a. test stence
1  for which is ? was a time

str.replacement((适用于Regex,其中.是一个特殊字符,表示";任何";性格如果你想要一个文字点,你需要转义它:"."。其他特殊Regex字符(如?(也是如此。

首先,请注意Pandasreplace方法与标准Python方法不同,后者只对固定字符串进行操作。Pandas函数可以表现为正则string.replacere.sub(正则表达式替换方法(,具体取决于标志的值,默认情况下表现为类似re.sub。因此,您需要将您的第一个参数视为正则表达式。这意味着您必须更改字符串,但它也有一个好处,即允许您在一个调用中同时进行两个替换。

正则表达式不是一个要从字面上搜索的字符串,而是一个充当指令的模式,告诉Python要搜索什么。大多数字符只是要求Python匹配自己,但有些字符是特殊的,.?恰好都属于特殊类别。

最简单的方法是使用一个字符类来匹配.?,后跟一个句点,并记住它是哪一个,这样它就可以包含在替换中,而不需要后面的句点。看起来是这样的:

testDF.replace(regex=r'([.?]).', value=r'1')

CCD_ 14表示";匹配一个周期或一个问号";;因为他们在[里面。。。],那些通常特殊的字符不需要转义。方括号周围的括号告诉Python记住这两个字符中的哪一个是它实际找到的。为了匹配,下一件必须存在的事情是你试图去掉的句点,它必须用反斜杠转义,因为这个句点在[内是而不是。。。CCD_ 18。

在替换中,特殊序列1表示";无论你发现什么与第一组括号之间的模式匹配";,这要么是句号,要么是问号。由于这是全部替换,因此删除了以下时段。

现在,您会注意到我使用了原始字符串(r''(;这使Python无法在replace可以之前对反斜杠进行自己的解释。如果替换只是'1’而没有r,则它将用字符代码1(对照-A(而不是第一个匹配的组来替换它们。

要同时替换?.,可以用|(正则表达式OR运算符(分隔。

testDf['strings'].str.replace('?.|..', '.')

..前面加一个,因为.是正则表达式字符,所以需要转义:

testDf['strings'].str.replace('..', '.')

您可以对?执行同样的操作,它是另一个regex字符。

testDf['strings'].str.replace('?.', '.')

最新更新