Python: разные регулярные выражения с разными подстановками - PullRequest
0 голосов
/ 03 июля 2018

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

  • regex1: если текст содержит слово «основатель», заменить весь текст на Генеральный директор
  • регулярное выражение 2: если текст содержит 9-значное число, замените его на NUM

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

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

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

Буду признателен, если кто-то поможет мне в этом!

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

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

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 голосов
/ 03 июля 2018

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

Ex:

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
...