Python - 与其他字符串一样的单词大写

时间:2018-06-11 18:35:56

标签: python string

我有两个包含全名的字符串。对于全名中的每个名称,如果名称出现在另一个字符串中,我想交叉引用它在另一个字符串中的大小写。然后我想用它在另一个字符串中大写的方式替换回原始字符串。

这是我做过的尝试之一:

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

4 个答案:

答案 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