Regex для обработки тегов со специальными символами независимо от порядка - PullRequest
1 голос
/ 10 марта 2020

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, независимо от порядка и запятой, в конце концов, две вещи, которые нужно исправить в правиле регулярных выражений, предложения?

1 Ответ

0 голосов
/ 12 марта 2020

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

(?s)(PX=[^,]+(?:,(?=.*PX=))?|)(?:(?!PX=).)?

См. Демоверсию regex

Заменить на \1 (в вашем коде это $1). ПРИМЕЧАНИЕ , что шаблон может соответствовать пустой строке, но поскольку он используется для удаления найденных подстрок, все в порядке.

Подробности

  • (?s) - встроенный флаг re.DOTALL, который делает . символами разрыва строки также
  • (PX=[^,]+(?:,(?=.*PX=))?|) - группа 1:
    • PX=[^,]+ - PX=, а затем 1+ символов, кроме запятой
    • (?:,(?=.*PX=))? - необязательная запятая, за которой следует любое количество символов 0+ (.*) и затем PX=
  • (?:(?!PX=).)? - необязательная последовательность: любой символ, 1 или 0 раз, который не является начальным символом последовательности PX=.

См. 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)


inputStr = "XZ=Rep.com,PX=TE-ST-,PX=Zen,PX=TAG,M=Dana,I=JAR"
rule= 'RULE:(?s)(PX=[^,]+(?:,(?=.*PX=))?|)(?:(?!PX=).)?/$1/,DEFAULT'
print(getPX(inputStr,rule))
print(getPX("PX=$#XN,I=JAR,M=Dana,PX=Faber,PX=Module,OU=gif,XZ=dana-fa.com,PX=GAN%",rule))

Выход:

PX=TE-ST-,PX=Zen,PX=TAG
PX=$#XN,PX=Faber,PX=Module,PX=GAN%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...