Я хочу заменить все одинарные кавычки в строке на double, за исключением таких случаев, как "not", "ll", "m" и т.д.
input="the stackoverflow don\'t said, \'hey what\'"
output="the stackoverflow don\'t said, \"hey what\""
Код 1: (@https://stackoverflow.com/users/918959/antti-haapala)
def convert_regex(text):
return re.sub(r"(?<!\w)'(?!\w)|(?<!\w)'(?=\w)|(?<=\w)'(?!\w)", '"', text)
Есть 3 случая: "НЕ предшествует и НЕ следует буквенно-цифровым символом; или не предшествует, но следует буквенно-цифровой символ; или предшествует и не следует буквенно-цифровым символом.
Проблема: это не работает над словами, которые заканчиваются апострофом, т.е. большинство притяжательных множественных чисел, а также не работает на неофициальных аббревиатуры, начинающиеся с апострофа.
Код 2: (@https://stackoverflow.com/users/953482/kevin)
def convert_text_func(s):
c = "_" #placeholder character. Must NOT appear in the string.
assert c not in s
protected = {word: word.replace("'", c) for word in ["don't", "it'll", "I'm"]}
for k,v in protected.iteritems():
s = s.replace(k,v)
s = s.replace("'", '"')
for k,v in protected.iteritems():
s = s.replace(v,k)
return s
Слишком большой набор слов для указания, как можно указать людей и т.д. Пожалуйста, помогите.
Изменить 1: Я использую @anubhava brillant ответ. Я столкнулся с этой проблемой. Иногда есть языковые переводы, которые не подходят. Код =
text=re.sub(r"(?<!s)'(?!(?:t|ll|e?m|s|d|ve|re|clock)\b)", '"', text)
Проблема:
В тексте, "Kumbh melas" melas - это перевод на хинди на английский, а не множественные притяжательные существительные.
Input="Similar to the 'Kumbh melas', celebrated by the banks of the holy rivers of India,"
Output=Similar to the "Kumbh melas', celebrated by the banks of the holy rivers of India,
Expected Output=Similar to the "Kumbh melas", celebrated by the banks of the holy rivers of India,
Возможно, я хочу добавить условие, которое каким-то образом его исправляет. Последним вариантом является вмешательство на уровне человека.
Изменить 2: Наивный и длительный подход к исправлению:
def replace_translations(text):
d = enchant.Dict("en_US")
words=tokenize_words(text)
punctuations=[x for x in string.punctuation]
for i,word in enumerate(words):
print i,word
if(i!=len(words) and word not in punctuations and d.check(word)==False and words[i+1]=="'"):
text=text.replace(words[i]+words[i+1],words[i]+"\"")
return text
Есть ли какие-либо угловые случаи, которые у меня отсутствуют или есть какие-то лучшие подходы?