我有两个包含全名的字符串。对于全名中的每个名称,如果名称出现在另一个字符串中,我想交叉引用它在另一个字符串中的大小写。然后我想用它在另一个字符串中大写的方式替换回原始字符串。
这是我做过的尝试之一:
alt_name = 'John A. desmith'
name = 'John R. DeSmith'
alt_names = alt_name.split()
for i in range(len(alt_names)):
if alt_names[i] in name:
alt_names[i] = re.findall(alt_names[i], name, flags=re.IGNORECASE)
alt_names
期望的结果:
John A. DeSmith
答案 0 :(得分:1)
如果你不关心保留空格的数量,这样的东西会起作用,并且可能比使用正则表达式更快:
alt_name = 'John A. desmith'
name = 'John R. DeSmith'
d = {s.lower(): s for s in name.split()}
corrected_alt_name = ' '.join(d.get(s.lower(), s) for s in alt_name.split())
print(corrected_alt_name)
John A. DeSmith
如果您关心空格,那么您可以使用re.split()代替str.split(),如here所述:
import re
corrected_alt_name = ''.join(d.get(s.lower(), s) for s in re.split(r'(\s+)', alt_name))
print(corrected_alt_name)
答案 1 :(得分:0)
我不完全确定我是否需要遵守满足您期望结果的标准。
但我首先要创建正确单词词典:
name = 'John R. DeSmith'
collection = {}
for part in name.split():
collection[part.lower()] = part
字典非常简陋,只会根据相互匹配的小写字符串匹配相同的匹配。
然后你可以开始交叉引用你所放置的名字的每个部分"进入它"。
alt_name = 'John A. desmith'
correct_spelling = []
for part in alt_name.split():
if part.lower() in collection:
correct_spelling.append(collection[part.lower()])
else:
correct_spelling.append(part)
print('Correctly spelled: {}'.format(' '.join(correct_spelling)))
还有其他匹配单个部分或整个字符串的方法,一个例子是Levenshtein distance comparison。
distance('Levenshtein', 'Levenshten')
将导致1
,意味着这两个单词被1个字符关闭。如果你需要对上面的匹配进行简单的拼写检查,请使用它。
答案 2 :(得分:0)
这是一种方法。
import re
alt_name = 'John A. desmith'
name = 'John R. DeSmith'
def caps(alt_name, name):
list_alt_name = alt_name.split()
for i, value in enumerate(list_alt_name):
m = re.search(r"\b{0}\b".format(value), name, flags=re.IGNORECASE)
if m:
list_alt_name[i] = m.group(0)
return " ".join(list_alt_name)
print( caps(alt_name, name) )
<强>输出:强>
John A. DeSmith
答案 3 :(得分:0)
澄清:无法修改原始字符串,因为python字符串是不可变的。
考虑到这一点,这个脚本旨在保留&#34; name&#34;中的不同值。 (当不同时)来自alt_name:
alt_name = 'John A. desmith'.split()
name = 'john R. DeSmith'.split()
我们保留&#34; R。&#34;来自&#34; name&#34; :
#!/usr/bin/python
alt_name = 'John A. desmith'.split()
name = 'john R. DeSmith'.split()
newName=[]
for i in range(0,len(name)) :
if name[i].lower() == alt_name[i].lower() :
newName.append(name[i].capitalize())
else :
newName.append(name[i].capitalize())
print ' '.join(newName)
<强>输出:强>
mortiz@florida:~/Documents/projects/python$ python string_names.py
John R. Desmith
如果你想保留&#34; A。&#34;的价值。 in&#34; alt_name&#34;只是改变:
else :
newName.append(alt_name[i].capitalize())
<强>输出:强>
mortiz@florida:~/Documents/projects/python$ python string_names.py
John A. Desmith