регулярное выражение Python в re.sub - как? - PullRequest
0 голосов
/ 18 сентября 2018

Можно ли использовать регулярные выражения python в re.sub()?Я попробовал несколько вариантов без удачи.Вот что у меня есть.

import re
# match anything: <test> always true
a = re.compile('(?P<test>.*)')  

# return _'yes'_ or 'no' based on <test>
a.sub('(?(\g<test>)yes|no)', 'word')
'(?(word)yes|no)'

Я ожидал, что «да» или «нет», а не реальный тест.

Из этого я получаю то, что <test> видно, ноУсловное выражение не выполняется.Есть ли другой способ сделать это?

Я пытался с re.sub(pat, rep, str) с теми же результатами.

1 Ответ

0 голосов
/ 18 сентября 2018

Если вы хотите выполнить условное замещение, используйте функцию в качестве параметра replace .

Эта функция принимает параметр match (что было перехвачено), и его результатом является текст, который будет заменен вместо совпадения.

Для ссылки в функции замены на группу захвата с именем test , используйте group('test').

Пример программы:

import re

def replTxt(match):
    return 'yes' if match.group('test') else 'no'

a = re.compile('(?P<test>.+)')  
result = a.sub(replTxt, 'word')
print(result)

Но у меня есть такое замечание:

Нет шансов, что no когда-либо будет заменен этой программой.Если регулярное выражение не совпадает, функция replTxt просто не будет вызываться.

Чтобы иметь возможность, что группа test ничего не соответствует, но что-то сопоставлено:

  • эта группа захвата должна быть условной (? после нее),
  • , чтобы не совпадать с пустым текстом, регулярное выражение должно содержать что-то большее, например:(?P<test>[a-z]+)?\d.
...