У меня есть несколько различных регулярных выражений, которые должны быть сопоставлены и замещены в данном тексте.
Я пытаюсь сделать это с помощью комбинированного регулярного выражения следующим образом:
regex = re.compile(r'((.*)founder(.*)|^[0-9]{4}$')
Проблема в том, что при применении подстановки в регулярном выражении мне нужно знать, какой из комбинированных шаблонов соответствует соответствующей подстановке.
Я был бы признателен, если кто-то может помочь мне реализовать это!
Вы можете использовать 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
Кажется, вы можете легко избежать регулярного выражения здесь:
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
).
re
не поддерживает условную замену строки. Смотрите мой фрагмент и портной для ваших конкретных потребностей.