Замените значение на предыдущее вхождение акронима с помощью модуля регулярных выражений python

#python #regex #string #replace #re

#python #регулярное выражение #строка #заменить #python-re

Вопрос:

Мне нужно добавить предыдущее слово в -number, которое произошло до -number предложения. Пожалуйста, просмотрите входную строку и ожидаемую выходную строку для получения дополнительных разъяснений. Я пробовал .replace .sub методы регулярных выражений со статическим способом, который является своего рода обработанным выводом.

Входная строка:

Угри стимулировали экспрессию мРНК интерлейкина (IL) -1, -8, LL-37, MMP-1, -2, -3, -9 и -13 в кератиноцитах.

Ожидаемая выходная строка:

Угри стимулировали экспрессию мРНК интерлейкина (IL)-1, интерлейкина (IL)-8, LL-37, MMP-1, MMP-2, MMP-3, MMP-9 и MMP-13 в кератиноцитах.

Код:

 import re
string_a = "The acnes stimulated the mRNA expression of interleukin (IL)-1, -8, LL-37, MMP-1, -2, -3, -9, and -13 in keratinocytes."
regex1 = re.findall(r"[a-z] s ( [A-Z] ) -d ,s -d, ", string_a)
regex2 = re.findall(r"[A-Z] -d ,s -d,s -d,s -d,s [a-z] s -d ", string_a)
 

Комментарии:

1. не могли бы вы сделать строку вашего примера немного короче?

2. @PatrickParker Теперь я сделал его короче.

Ответ №1:

Вы можете использовать

 import re
string_a = "The acnes stimulated the mRNA expression of interleukin (IL)-1, -8, LL-37, MMP-1, -2, -3, -9, and -13 in keratinocytes."
pattern = re.compile(r"b([A-Za-z] s*([A-Z] )|[A-Z] )(s*-d (?:,s*-d )*)(?:,s*ands (-d ))?")
print( pattern.sub(lambda x: x.group(1)   f', {x.group(1)}'.join(map(str.strip, x.group(2).strip().split(',')))   (f', and {x.group(1)}{x.group(3)}' if x.group(3) else ''), string_a) )
# => The acnes stimulated the mRNA expression of interleukin (IL)-1, interleukin (IL)-8, LL-37, MMP-1, MMP-2, MMP-3, MMP-9, and MMP-13 in keratinocytes.
 

Смотрите демонстрацию Python и демонстрацию регулярных выражений.

Подробные сведения

  • b — граница слова
  • ([A-Za-z] s*([A-Z] )|[A-Z] ) — Захват группы 1: одна или несколько букв ASCII, затем ноль или более пробелов, ( , одна или несколько прописных букв ASCII и a ) , ИЛИ одна или несколько прописных букв ASCII
  • (s*-d (?:,s*-d )*) — Захват группы 2: ноль или более пробелов, - , одна или более цифр, а затем ноль или более последовательностей запятой, ноль или более пробелов - и одна или более цифр
  • (?:,s*ands (-d ))? — необязательная группа без захвата: запятая, ноль или более пробелов, and , один или несколько пробелов, затем группа захвата 3: - , одна или несколько цифр.

Значение группы 1 добавляется ко всем числам группы 2, разделенным запятыми, внутри лямбда-выражения, используемого в качестве заменяющего аргумента.

Если группа 3 совпадает, and пробел добавляются объединенные значения группы 1 и группы 3.

Комментарии:

1. @SachinSinkar Я видел это, но мне не ясно, какие здесь правила.