Python: разные регулярные выражения с разными подстановками

1

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

  • regex1: если текст содержит слово "основатель", замените весь текст генеральным директором
  • regex 2: если текст содержит 9-значное число, замените его на NUM

Я пытаюсь сделать это с помощью комбинированного регулярного выражения следующим образом:

regex = re.compile(r'((.*)founder(.*)|^[0-9]{4}$')

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

Я был бы признателен, если кто-то может помочь мне реализовать это!

  • 1
    пожалуйста, приведите несколько примеров
  • 0
    Вы хотите объединить два совершенно независимых регулярных выражения в одно? Почему? Это должно быть намного медленнее и более подвержено ошибкам, чем просто выполнение каждой подстановки регулярного выражения в последовательности.
Показать ещё 2 комментария
Теги:
substitution

2 ответа

1

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

Пример:

import re

s = """ if the text contains the word founder
123456789 sdfsdfsdf sdfsdf sdfsdfsdf"""

text = re.sub("founder", "CEO", s)
text = re.sub("[0-9]{9}", "NUM", text)  

print(text)

Выход:

 if the text contains the word CEO
NUM sdfsdfsdf sdfsdf sdfsdfsdf
  • 0
    Он также хочет знать, какая замена была выполнена. Я думаю, добавление re.match перед каждым re.sub будет работать.
  • 0
    На самом деле я должен применить эти замены к столбцу файла CSV, который содержит большое количество строк. Поэтому я хочу сделать это за один проход для данной строки ... также число регулярных выражений не 2, а более 20 ... поэтому я не могу сделать это индивидуально для каждого регулярного выражения
Показать ещё 1 комментарий
0

Кажется, вы можете легко избежать регулярного выражения здесь:

def replace_em(text):
    if 'founder' in text:                   # if text contains founder
        return 'CEO'
    elif text.isdigit() and len(text) == 9: # all digits and length = 9
        return 'NUM'
    else:
        return text

print(replace_em("Some founder here")) # CEO
print(replace_em("123456789"))         # NUM
print(replace_em("Some other text"))   # Some other text

См. Демонстрацию Python.

Если вы хотите поиграть с regex и re.sub вы можете попробовать использовать этот код, но помните, что он менее эффективен:

import re

def replace_em(m):
    return 'NUM' if m.group(1) else 'CEO'

regex = re.compile(r'(?s)^([0-9]{9})$|.*founder.*')

print(re.sub(regex, replace_em, "Some founder here"))
print(re.sub(regex, replace_em, "123456789"))
print(re.sub(regex, replace_em, "Some other text"))

См. Еще одну демонстрацию Python

Здесь, (?s).*founder.*|^([0-9]{9})$ соответствует любой строке, содержащей founder в ней с первым альтернативом (ум (?s) делает . Соответствует любому символу, включая разрыв строки символы), а другая альтернатива соответствует и фиксирует в Группе 1 девятизначную строку. Второй аргумент - это метод обратного вызова, который заменяет совпадения на основе пользовательской логики (если соответствует группе 1, замените ее на NUM else, CEO).

  • 0
    На самом деле я должен применить эти замены к столбцу файла CSV, который содержит большое количество строк. Поэтому я хочу сделать это за один проход для данной строки ... также число регулярных выражений не 2, а более 20 ... поэтому я не могу сделать это индивидуально для каждого регулярного выражения
  • 0
    @lyesAlgerian Тогда вам все равно придется использовать какой-то метод обратного вызова, поскольку re не поддерживает условную замену строки. Смотрите мой фрагмент и портной для ваших конкретных потребностей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню