Как сопоставить строку из нескольких строк с помощью Python Regex? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть 2 строки ниже:

/ begin ИЗМЕРЕНИЕ ANYNAME1"Unterstützungskraft Softwaremodul"

SWORD ANYNAME2 1 100 - Randomdigits1 Randomdigits2

, и я хочу сопоставить ANYNAME1 , ANYNAME2 , Randomdigits1 и Randomdigits2

Пока что я могу сопоставить ANYNAME1 в первой строке, используя приведенное ниже регулярное выражение:

_regex_struct = re.compile(r'/begin MEASUREMENT (.*)(.*)\n')

, но я не могуперейти на вторую строчку.Как сопоставить выражение во второй строке ??

Ответы [ 3 ]

1 голос
/ 09 апреля 2019
In [20]: s = '''/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul "
    ...: SWORD ANYNAME2 1 100 -Randomdigits1 Randomdigits2'''

In [31]: re_struct = re.compile(r'/begin MEASUREMENT (\w+)[\s\S]*?SWORD (\w+).*?100 -(\w+) (\w+)')

In [32]: m = re_struct.search(s)

In [33]: m.group(1), m.group(2), m.group(3), m.group(4)
Out[33]: ('ANYNAME1', 'ANYNAME2', 'Randomdigits1', 'Randomdigits2')
1 голос
/ 09 апреля 2019

Вы можете сопоставить ANYNAME1 в группе захвата в первой строке, затем использовать .*, чтобы добраться до конца строки, и использовать \n, чтобы сопоставить новую строку, чтобы добраться до второй строки.Там вы можете сопоставить и зафиксировать свои значения, используя 3 группы.

/begin MEASUREMENT ([\w.]+).*\nSWORD ([\w.]+) \d+ \d+ (-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?)

Regex demo | Python demo

Пояснение

  • /begin MEASUREMENT Совпадение буквально сопровождается пробелом
  • ([\w.]+).*\n Захват 1+ слово chars или точка в группе 1 и совпадать до конца строки.Затем сопоставьте новую строку
  • SWORD ([\w.]+) Совпадение SWORD и захватите в группе 2 1+ раза слово char или точку
  • \d+ \d+ Матч пробел, 1+ цифр, пробел, 1+ пробел
  • (-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?) Записать в группе 3 и 4 необязательный знак минуса, 1+ цифры и необязательную десятичную часть с пробелом между

Например:

import re

regex = r"/begin MEASUREMENT ([\w.]+).*\nSWORD ([\w.]+) \d+ \d+ (-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?)"
test_str = ("/begin MEASUREMENT ANY.NAME1 \"Unterstützungskraft Softwaremodul \"\n"
    "SWORD ANYN.AME2 1 100 -2342342523 -14.29")
print(re.findall(regex, test_str))

# [('ANY.NAME1', 'ANYN.AME2', '-2342342523', '-14.29')]
1 голос
/ 09 апреля 2019

Я просто делаю предположение с вашим вкладом.Вы можете проверить RegexDemo .

inputstr = '''/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul "  
SWORD ANYNAME2 1 100 -2342342523 2432343535654
'''
_regex_struct = re.compile(r'/begin\s+MEASUREMENT\s+(?P<name1>[\w.]+)\W.*\nSWORD\s+(?P<name2>[\w.]+)\W.+\s+(?P<digit1>-\d.+|\d.+)\s+(?P<digit2>-\d.+|\d.+)')
_regex_struct.findall(inputstr)

Выход:

[('ANYNAME1', 'ANYNAME2', '-2342342523', '2432343535654')]

Объяснение выражения:

\s =любой пробельный символ

(?P<>) = для создания группы ожидаемого вывода

\w = любой символ слова

\W = любой несловесный символ

\d = любая цифра

+ = для выражения одной или нескольких

...