Я написал регулярное выражение для сопоставления подстроки с пробелами вокруг нее, но это не работает хорошо - PullRequest
2 голосов
/ 19 октября 2019

На самом деле я работал над проблемой регулярных выражений, задача которой состоит в том, чтобы взять подстроку (||, &&) и заменить ее другой подстрокой (или, и), и я написал для нее код, но это не работает хорошо

question = x&& &&& && && x || | ||\|| x
Expected output = x&& &&& and and x or | ||\|| x

Вот код, который я написал

import re
for i in range(int(input())):
    print(re.sub(r'\s[&]{2}\s', ' and ', re.sub(r"\s[\|]{2}\s", " or ", input())))

Мой вывод = x && &&& и && x или ||| \ ||х

Ответы [ 3 ]

4 голосов
/ 19 октября 2019

Вам нужно использовать обходные пути, проблема с текущим регулярным выражением: && && здесь && первое совпадение захватывает пространство, поэтому до второго && нет свободного места, и оно не будет совпадать, поэтому мынеобходимо использовать zero-length-match ( lookarounds)

Заменить регулярное выражение

\s[&]{2}\s  -->  (?<=\s)[&]{2}(?=\s)
\s[\|]{2}\s -->    (?<=\s)[\|]{2}(?=\s)

(?<=\s) - Совпадение должно предшествовать пробелам

(?=\s) - Совпадение должно бытьсопровождаемые пробелами

0 голосов
/ 19 октября 2019

Попробуйте использовать re.findall() вместо re.sub

0 голосов
/ 19 октября 2019

Вы ищете регулярное выражение, например (?<=\s)&&(?=\s) (демонстрационное выражение)

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

import re

in_str = 'x&& &&& && && x || | ||\|| x'
expect_str = 'x&& &&& and and x or | ||\|| x'

print(re.sub("(?<=\s)\|\|(?=\s)", "or", re.sub("(?<=\s)&&(?=\s)", "and", in_str)))

Python demo

...