Регулярное выражение Python re.sub () не соответствует и заменяет как ожидалось - PullRequest
2 голосов
/ 25 сентября 2019

Следующее регулярное выражение не заменяет подстроки, как ожидалось.

Я попытался запустить код со следующими изменениями (по одной, разумеется), но все безуспешно:

  • Использование представлений списка (текущий)
  • Использование традиционного цикла for
  • Добавление результата регулярного выражения обратно в сам итератор
  • Добавление результата регулярного выражения в новый список
  • Проверен тип 'name' (это строка)
  • Используется (копируется) формат кода из другого регулярного выражения в моей записной книжке, который в данный момент работает
  • Поместите регулярное выражение вregex101.com, чтобы убедиться, что он функционирует (вы можете увидеть регулярное выражение и данные, которые я использую здесь
  • Добавление / удаление индикаторов необработанных строк, предшествующих шаблонам регулярных выражений и подстановок

names - это список строк

reg_pattern = r"(?!\\s)(\\W[^\\W,]+)(?!,) and\\s([^ ]+ )([^ ]+)"
sub_pattern = r"\\1 \\3 \\2\\3"
cleaned_names = []
cleaned_names = [re.sub(reg_pattern, sub_pattern, name) for name in names]

Цель можно увидеть по ссылке выше (особенно в разделе «Замена» в нижней части этой страницы), но в конечном итоге мне нужноприложитьконец group3 регулярного выражения до конца group1.

1 Ответ

2 голосов
/ 25 сентября 2019

Я предполагаю, что, возможно, вы пытаетесь re.sub назвать пары, для которых вы, вероятно, можете написать выражение, похожее на:

([A-Z][a-z]+)\s+and\s+(.*)([A-Z]\S*)

, если у вас нет краевых случаев,если вы сделаете это, вы, вероятно, захотите изменить классы символов [A-Z] и добавить туда другие символы.

Демо

Тест

import re

l = ['George Rosario, Ali Jones, Barbara Boll, and Lindsay McKelvoy', 'Jan and Edgar Adelman', 'Bill Mack and Les Lieberman', 'Dr. Susan Muehle-Bussel, Ray Morales, and Dr. Samuel Barker', 'Dan Barroso and Emily High', 'Cassie and George Sorenson', 'Tom Scott and Mark Smith', 'The scene at IDEAL School & Academy’s 10th\xa0Annual Gala.',
     'Les Lieberman, Barri Lieberman, Isabel Kallman, Trish Iervolino, and Ron Iervolino', 'Chuck Grodin', 'Diana Rosario, Ali Sussman, Sarah Boll, Jen Zaleski, Alysse Brennan, and Lindsay Macbeth', 'Kelly and Tom Murro', 'Udo Spreitzenbarth', 'Ron Iervolino, Trish Iervolino, Russ Middleton, and Lisa Middleton', 'Barbara Loughlin, Dr. Gerald Loughlin, and Debbie Gelston', 'Julianne Michelle']

e = r'([A-Z][a-z]+)\s+and\s+(.*)([A-Z]\S*)'

l_out = []
for names in l:
    if re.match(e, names):
        l_out.append(re.sub(e, r'\1 \3 and \2\3', names))
    else:
        l_out.append(names)

print(l_out)

Вывод

['Джордж Росарио, Али Джонс, Барбара Болл,и Линдсей МакКелвой »,« Ян Адельман и Эдгар Адельман »,« Билл Мак и Ле Либерман »,« ДокторСьюзен Мюле-Бассель, Рэй Моралес и доктор Сэмюэл Баркер »,« Дэн Баррозу и Эмили Хай »,« Кэсси Соренсон и Джордж Соренсон »,« Том Скотт и Марк Смит »,« Сцена в 10-й ежегодной школе IDEAL School & Academy »Gala. ',' Les Lieberman, Барри Либерман, Изабель Каллман, Триш Иерволино и Рон Иерволино ',' Чак Гродин ',' Диана Росарио, Али Суссман, Сара Болл, Джен Залески, Алиссе Бреннан и Линдсей Макбет ',' КеллиМурро и Том Мурро »,« Udo Spreitzenbarth »,« Рон Иерволино, Триш Иерволино, Русс Миддлтон и Лиза Миддлтон »,« Барбара Лафлин, доктор Джеральд Лафлин и Дебби Гелстон »,« Джулианна Мишель »]


Или вы можете попробовать

import re

l = ['George Rosario, Ali Jones, Barbara Boll, and Lindsay McKelvoy', 'Jan and Edgar Adelman', 'Bill Mack and Les Lieberman', 'Dr. Susan Muehle-Bussel, Ray Morales, and Dr. Samuel Barker', 'Dan Barroso and Emily High', 'Cassie and George Sorenson', 'Tom Scott and Mark Smith', 'The scene at IDEAL School & Academy’s 10th\xa0Annual Gala.',
     'Les Lieberman, Barri Lieberman, Isabel Kallman, Trish Iervolino, and Ron Iervolino', 'Chuck Grodin', 'Diana Rosario, Ali Sussman, Sarah Boll, Jen Zaleski, Alysse Brennan, and Lindsay Macbeth', 'Kelly and Tom Murro', 'Udo Spreitzenbarth', 'Ron Iervolino, Trish Iervolino, Russ Middleton, and Lisa Middleton', 'Barbara Loughlin, Dr. Gerald Loughlin, and Debbie Gelston', 'Julianne Michelle']

e = r'([A-Z][a-z]+)\s+and\s+(.*)([A-Z]\S*)'

l_out = []
for names in l:
    if re.match(e, names):
        l_out.append(re.sub(e, r'\1 \3', names))
        l_out.append(re.sub(e, r'\2\3', names))
    else:
        l_out.append(names)

print(l_out)

Вывод

['Джордж Росарио, Али Джонс, Барбара Болл и Линдсей МакКелвой', 'Ян Адельман' ', «Эдгар Адельман», «Билл Мак и Ле Либерман», «ДокторСьюзен Мюле-Бассель, Рэй Моралес и доктор Сэмюэл Баркер, «Дэн Баррозу и Эмили Хай», «Кэсси Соренсон», «Джордж Соренсон», «Том Скотт и Марк Смит», «Сцена в школе IDEAL и Академии 10-го числа»\ xa0 Ежегодный гала. ',' Ле Либерман, Барри Либерман, Изабель Каллман, Триш Иерволино и Рон Иерволино ',' Чак Гродин ',' Диана Росарио, Али Суссман, Сара Болл, Джен Залески, Алиссе Бреннан и Линдсей Макбет '«Келли Мурро», «Том Мурро», «Удо Спрайтенбарт», «Рон Иерволино, Триш Иерволино, Русс Миддлтон и Лиза Миддлтон», «Барбара Лафлин, доктор Джеральд Лафлин и Дебби Гелстон», «Джулианна Мишель»]


Если вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com .Если хотите, вы можете также посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...