У меня есть ниже 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')
но я не могу перейти на вторую строку. Как сопоставить выражение во второй строке??
Какой результат вы ожидаете?
Они также могут быть плавающими и отрицательными числами.
Я ожидаю ANYNAME1 , ANYNAME2 , Randomdigits1 и Randomdigits2 в группе (1), группе (2), группе (3), группе (4)
Вы имеете в виду вот так? regex101.com/r/lbaUpX/1
Я просто делаю предположение с вашим вкладом. Вы можете проверить файл 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
Не могли бы вы объяснить выражение, которое вы использовали?
Спасибо!! Как сопоставить, когда ANYNAME1 может иметь 2 формата: «ABC.DEF» или «ABCDEF»?
я изменил регулярное выражение
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')]
Не могли бы вы предоставить нам больше примеров ввода? Итак, мы видим закономерность. Оба
Randomdigits
целые?