我有以下代码片段:
import pandas as pd
df = pd.DataFrame([{'LastName':'VAN HOUTEN'},
{'LastName':"O'BOYLE"},
{'LastName':'ESTEVAN-GONZALEZ'},
{'LastName':'RODRIGO TEIXEIRA'},
{'LastName':'ESTEBAN GONZALEZ'},
{'LastName':'O ROURKE'},
{'LastName':'RODRIGO-TEIXEIRA'}])
delete_space_after_list = ['VAN','O']
df['NewName'] = df['LastName'].str.replace("'"," ")
for s in delete_space_after_list[:]:
df['NewName'] = df['NewName'].str.replace(s + ' ', s)
df['NewName'] = df['NewName'].str.replace('-'," ")
df['NewName'] = df['NewName'].str.split().str.get(0)
运行此代码给出以下结果:
Index LastName NewName
0 VAN HOUTEN VANHOUTEN
1 O'BOYLE OBOYLE
2 ESTEVAN-GONZALEZ ESTEVAN
3 RODRIGO TEIXEIRA RODRIGOTEIXEIRA
4 ESTEVAN GONZALEZ ESTEVANGONZALEZ
5 O ROURKE OROURKE
6 RODRIGO-TEIXEIRA RODRIGO
但是期望的输出是这样的
Index LastName DesiredName
0 VAN HOUTEN VANHOUTEN
1 O'BOYLE OBOYLE
2 ESTEVAN-GONZALEZ ESTEVAN
3 RODRIGO TEIXEIRA RODRIGO
4 ESTEVAN GONZALEZ ESTEVAN
5 O ROURKE OROURKE
6 RODRIGO-TEIXEIRA RODRIGO
它消除了 RODRIGO 之后的空格(因为 LastName 末尾的“O”)并将其与“TEIXEIRA”连接起来,同样消除了 ESTEVAN 之后的空格(因为 LastName
末尾的“VAN”)并将其与“GONZALEZ”连接起来。但是,它正确地消除了其他名称中的空格。
如何让此代码像 VAN HOUTEN、O'BOYLE、ESTEVAN-GONZALEZ、O ROURKE 和 RODRIGO-TEIXEIRA 那样正确删除空格,同时不删除 ESTEVAN GONZALEZ 和 RODRIGO TEIXEIRA 之后的空格?
最佳答案
因此,您想要删除“不太重要”的名称,该名称是由以 O
或 VAN
结尾的名称定义的,但不是being O
或 VAN
,并删除其他名称的非字母。
这是正则表达式的工作(或者没有它们,这是一项漫长而痛苦的工作)
我会通过像这样链接2个正则表达式来做到这一点(我将 pandas 排除在外,因为问题与 pandas 没有直接关系):
data = [{'LastName':'VAN HOUTEN'},
{'LastName':"O'BOYLE"},
{'LastName':'ESTEVAN-GONZALEZ'},
{'LastName':'RODRIGO TEIXEIRA'},
{'LastName':'ESTEVAN GONZALEZ'}, # not ESTEBAN as in your example!
{'LastName':'O ROURKE'},
{'LastName':'RODRIGO-TEIXEIRA'}]
import re
new_data = [re.sub("\W","",re.sub("(.)(O|VAN)\W.*",r"\1\2",v['LastName'])) for v in data]
print(new_data)
结果:
['VANHOUTEN', 'OBOYLE', 'ESTEVAN', 'RODRIGO', 'ESTEVAN', 'OROURKE', 'RODRIGO']
所以:
"(.)(O|VAN)\W.*"
匹配至少一个字符,后跟O
和VAN
前缀,后跟一个非字母 (\W
) 和其余的,我们跳过(我们只保留前 2 个组):处理“不太重要的名称”"\W"
删除空格、破折号、引号...所有非字母数字。 Than 处理第二种情况。
关于python - 在Python中选择性地删除字符串后面的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143714/