Как включить ключи и значения из словаря в выражение регулярного выражения в python 3? - PullRequest
0 голосов
/ 06 января 2020

Мне нужно создать и изменить регулярные выражения, которые должны соответствовать любому ключу или значению в словаре.

Выполнить это в Ruby относительно просто, например, так:

names = {"John White"=>"一","George Black"=>"二","Mary Jane Fields"=>"三"}
string = "This involves John White (from now on: 'JW'), George Black (from now on: 'GB') and Mary Jane Fields (from now on: 'MJF'). JW wanted GB to tell MJF that he (GB) was with JW when MJF called JW."
names.each do |k,v|
    string.gsub! k,v
end
names.each_value do |v| 
    short_name = /(#{v}) \(from now on: '(.{2,4})'\)/.match(string).to_a
    string.gsub! short_name[2].to_s, short_name[1].to_s
end
puts string

Это дает следующий результат:

This involves 一 (from now on: '一'), 二 (from now on: '二') and 三 (from now on: '三'). 一 wanted 二 to tell 三 that he (二) was with 一 when 三 called 一.

где все имена ( реальное имя и имя adho c, данное после "отныне:"), были заменены значением в га sh.

При попытке обновить аналогичную программу из Ruby в Python, однако, у меня возникают проблемы при вставке ключа / значений в регулярное выражение в команде re.sub или аналогичной. Начало кода работает нормально, если выполняется следующим образом:

import re 
names = {"John White":"一","George Black":"二","Mary Jane Fields":"三"}
string = "This involves John White (from now on: JW), George Black (from now on: GB) and Mary Jane Fields (from now on: MJF). JW wanted GB to tell MJF that he (GB) was with JW when MJF called JW."
for key,value in names.items():
    string = re.sub(str(key),str(value),string)
print(string)

Но второе преобразование сложно, поскольку я не могу ввести значение в выражение регулярного выражения. Все последующие дают разные ошибки или просто не совпадают. Например, следующее создает объекты соответствия, но не захватывает и не изменяет строку:

for value in names.values():    
    pattern = re.search(str(value)+' \(from now on: (.{2,4})\)',string)
    string = re.sub(str(pattern),str(value),string)

Многие другие вещи также не работают. Любой способ включить вызовы в значения словаря внутри выражений регулярных выражений? В частности, в команде re.sub?

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Преобразование объекта pattern в строку приведет к чему-то вроде

"<re.Match object; span=(14, 33), match='一 (from now on: JW)'>"

, что явно не то, что вы ищете. Вы должны использовать группу совпадений с индексом 1:

string = re.sub(pattern[1], str(value), string)

В качестве примечания, не используйте имена из стандартной библиотеки Python (например, string) в качестве имен переменных.

0 голосов
/ 06 января 2020

Вы должны искать key, когда пытаетесь установить pattern, а не value. Также вам нужно извлечь содержимое группы 1, что вы можете сделать с помощью .group(1). Затем вы можете выполнить обе замены одновременно, сделав шаблон регулярного выражения из key и его сокращения:

import re 
names = {"John White":"一","George Black":"二","Mary Jane Fields":"三"}
string = "This involves John White (from now on: JW), George Black (from now on: GB) and Mary Jane Fields (from now on: MJF). JW wanted GB to tell MJF that he (GB) was with JW when MJF called JW."
for key,value in names.items():
    abbrev = re.search(key + r' \(from now on: (.{2,4})\)',string).group(1)
    string = re.sub(r'\b' + key + '|' + abbrev + r'\b', value, string)
print(string)

Вывод:

This involves 一 (from now on: 一), 二 (from now on: 二) and 三 (from now on: 三). 一 wanted 二 to tell 三 that he (二) was with 一 when 三 called 一.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...