Как сопоставить строку с несколькими строками с помощью Python Regex?

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

/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul "

SWORD ANYNAME2 1 100 -Randomdigits1Randomdigits2

и я хочу сопоставить ЛЮБОЕ ИМЯ1 , ЛЮБОЕ ИМЯ2 , Случайные цифры1 и Случайные цифры2

Пока я могу сопоставить ЛЮБОЕ ИМЯ1 в первой строке, используя регулярное выражение ниже:

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

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

Не могли бы вы предоставить нам больше примеров ввода? Итак, мы видим закономерность. Оба Randomdigits целые?

YusufUMS 09.04.2019 10:25

Какой результат вы ожидаете?

Waket Zheng 09.04.2019 10:29

Они также могут быть плавающими и отрицательными числами.

Anudocs 09.04.2019 10:29

Я ожидаю ANYNAME1 , ANYNAME2 , Randomdigits1 и Randomdigits2 в группе (1), группе (2), группе (3), группе (4)

Anudocs 09.04.2019 10:30

Вы имеете в виду вот так? regex101.com/r/lbaUpX/1

The fourth bird 09.04.2019 10:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
427
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я просто делаю предположение с вашим вкладом. Вы можете проверить файл 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 = any whitespace character

(?P<>) = to create a group of the expected output

\w = any word character

\W = any non-word character

\d = any digit

+ = to express one or more

Не могли бы вы объяснить выражение, которое вы использовали?

Anudocs 09.04.2019 10:35

Спасибо!! Как сопоставить, когда ANYNAME1 может иметь 2 формата: «ABC.DEF» или «ABCDEF»?

Anudocs 09.04.2019 10:58

я изменил регулярное выражение

YusufUMS 09.04.2019 11:03
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')

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

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

Демонстрация регулярных выражений | демонстрация Python

Объяснение

  • /begin MEASUREMENT Соответствует буквально пробелу
  • ([\w.]+).*\n Захватите 1+ словесных символов или точку в группе 1 и сопоставьте их до конца строки. Затем сопоставьте новую строку
  • SWORD ([\w.]+) Сопоставьте МЕЧ и захватите в группе 2 1+ раз слово символ или точку
  • \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')]

Другие вопросы по теме