更正 re.compile 以消除句点,但添加 space 作为逗号

Correct re.compile to eliminate periods but add space for comma

我有几行 python 代码遍历列表并从每一行中删除标点符号。这里的代码运行

import pandas as pd
import re
data = [['M.B.B.S'], ['M.B.B.S,B.S'],['ACN-P, D.N.P'],['ACNP-BC, DNP']] 
df = pd.DataFrame(data, columns = ['ID']) 
p = re.compile(r'[^\w\s\d]+')
df['ID'] = [p.sub('',x) for x in df['ID'].tolist()]
df

我面临的问题是我需要像上面那样用句点和破折号(“.”、“-”)代替 space,但逗号(“,” ) 替换 spaces。我无法获得正确的表达式语法。 例如,当我需要它读取“MBBS BS”

时,第 2 行给出了结果“MBBSBS”

只需在正则表达式之前进行备用替换:

df['ID'] = [p.sub('',x.replace(',',' ')) for x in df['ID'].tolist()]

或者,只需使用 Python 字符串方法 .translate 并完全跳过正则表达式:

import pandas as pd
import string

repl={ord(k):'' for k in string.punctuation}
repl[ord(',')]=' '
data = [['M.B.B.S'], ['M.B.B.S,B.S'],['ACN-P, D.N.P'],['ACNP-BC, DNP']] 
df = pd.DataFrame(data, columns = ['ID']) 

df['ID'] = [x.translate(repl) for x in df['ID'].tolist()]

>>> df
            ID
0         MBBS
1      MBBS BS
2    ACNP  DNP
3  ACNPBC  DNP

如果您不想 ', ' 变成两个空格,只需在其他替换之前替换那些:

df['ID'] = [x.replace(', ',' ').translate(repl) for x in df['ID'].tolist()]

你明白了...

你可以这样做:

df['ID'] = df.ID.str.replace('[.-]|(,\s*)',lambda x: ' ' if x.group(1) else '')
df
             ID
0          MBBS
1       MBBS BS
2      ACNP DNP
3    ACNPBC DNP

如果这很复杂,请执行:

 df['ID'] = df.ID.str.replace('[.-]','').str.replace(',\s*',' ')
 df
                 ID
    0          MBBS
    1       MBBS BS
    2      ACNP DNP
    3    ACNPBC DNP