Python Код
import re
def updateRule(rule):
tokens = rule.split('/')
return [tokens[0][len('RULE:'):] , tokens[1].replace('$','\\') ]
def getPX(inputStr,rule):
reg_match = updateRule(rule)
match = re.compile(reg_match[0])
return re.sub(match,reg_match[1],inputStr)
def main():
inputStr = "XZ=Rep.com,PX=TE-ST-,PX=Zen,PX=TAG,M=Dana,I=JAR"
rule= 'RULE:^XZ=[^,]+,(PX=.+),M=Dana,I=JAR$/$1/,DEFAULT'
print(getPX(inputStr,rule))
if __name__== "__main__":
main()
Ожидаемые входные строки / выходы :
Случай 1 :
inputStr = "XZ=Rep.com,PX=TE-ST-,PX=Zen,PX=TAG,M=Dana,I=JAR"
Desired output = "PX=TE-ST-,PX=Zen,PX=TAG"
Случай 2 :
inputStr = "PX=$#XN,I=JAR,M=Dana,PX=Faber,PX=Module,OU=gif,XZ=dana-fa.com,PX=GAN%"
Desired output = "PX=$#XN,PX=Faber,PX=Module,PX=GAN%"
Как видно, нам нужен только PX = , за которым следуют соответствующие значения в конечном выводе.
Случай 1 дает желаемый результат и работает нормально, случай 2 дает другие значения, отличные от PX =.
Я не хочу использовать findall () метод, но лучше изменить правило регулярных выражений в коде для решения этой проблемы, чтобы в окончательном выводе мы видели только PX =.
Как мы можем изменить приведенное ниже правило в коде для решения этой проблемы?
rule= 'RULE:^XZ=[^,]+,(PX=.+),M=Dana,I=JAR$/$1/,DEFAULT'
После большого количества исследований с (группировка, захват без группировки и т. Д. c)
Это новое правило регулярных выражений, которое я создал
"[A-Za-z_]+,((?:PX=[A-Za-z$-_ !]+,)+(?:PX=[A-Za-z$-_ !]+,)*).+"
Случай 1 работает нормально со следующим выводом (с добавленной запятой в выводе)
PX=TEST,PX=Zen,PX=TAG,
Получил работу и со специальными символами, но случай 2 дает сбой (потому что он не может принимать PX в любом случайном порядке, где PX может быть в начале, середине или конце). Итак, PX, независимо от порядка и запятой, в конце концов, две вещи, которые нужно исправить в правиле регулярных выражений, предложения?