这是本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.replace
或re.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('?.', '.')