簡體   English   中英

如何替換 '..' 和 '?.' 在 pandas 中有單句點和問號? df['column'].str.replace 不工作

[英]How to replace '..' and '?.' with single periods and question marks in pandas? df['column'].str.replace not working

這是此 SO 帖子的后續內容,它提供了替換字符串列中文本的解決方案

如何替換Pandas dataframe一列中的文字?

df['范圍'] = df['范圍'].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:

-regex bool , 默認 True

確定是否假定傳入的模式是正則表達式:如果為真,則假定傳入的模式是正則表達式。

? . ? . 是正則表達式中的特殊字符。
因此,沒有正則表達式的一種方法是雙重替換:

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

Output:

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

使用正則表達式替換。 在這種情況下,替換任何特殊字符 ' ' 緊隨其后的是空白。 這有點卷曲,我建議您使用@Mark Reed 回答 go。

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


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

str.replace()使用正則表達式,其中. 是一個特殊字符,表示“任何”字符。 如果你想要一個文字點,你需要轉義它: "\." . 其他特殊的 Regex 字符也一樣,比如? .

替換兩個? . 同時可以用|分隔 (正則表達式OR運算符)。

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

..前加上\前綴,因為您需要轉義為. 是正則表達式字符:

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

您可以對? , 這是另一個正則表達式字符。

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

首先,請注意Pandas replace方法不同於標准的 Python方法,后者僅對固定字符串進行操作。 Pandas 可以表現常規的string.replacere.sub (正則表達式替換方法),具體取決於標志的值,默認情況下表現為re.sub 因此,您需要將第一個參數視為正則表達式 這意味着您必須更改字符串,但它還有一個好處,即允許您在一次調用中進行兩個替換。

正則表達式不是按字面意思搜索的字符串,而是一種模式,它作為指令告訴 Python 要查找的內容。 大多數角色只是要求 Python 來匹配自己,但有些是特殊的,兩者都有. ? 碰巧屬於特殊類別。

最簡單的做法是使用字符 class來匹配其中任何一個. 或者? 后跟一個句點,並記住它是哪一個,以便它可以包含在替換中,只是沒有下一個句點。 看起來像這樣:

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

[.?]表示“匹配句號或問號”; 因為它們在[ ... ]中,所以不需要轉義那些通常特殊的字符。 方括號周圍的括號告訴 Python 記住這兩個字符中的哪一個是它實際找到的那個。 為了匹配,接下來必須存在的是你試圖擺脫的時期,它必須用反斜杠轉義,因為這個不在[ ... ]內。

在替換中,特殊序列\1表示“您發現的與第一組括號之間的模式匹配的任何內容”,因此它是句號或問號。 由於這是整個替換,因此刪除了以下期間。

現在,您會注意到我對兩者都使用了原始字符串 ( r' ... ' ); 這使 Python 無法在replace之前對反斜杠進行自己的解釋。 如果替換只是'\1 ' 而沒有r ,它將用字符代碼 1 (control-A) 代替它們,而不是第一個匹配的組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM