如何使用 Python 正则表达式匹配多行字符串?

How to Match mutilple line string using Python Regex?

我有以下 2 行:

/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul "

SWORD ANYNAME2 1 100 -Randomdigits1 Randomdigits2

我想匹配 ANYNAME1ANYNAME2Randomdigits1Randomdigits2

到目前为止,我可以使用以下正则表达式在第一行中匹配 ANYNAME1

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

但是我无法转到第二行。如何匹配第二行的表达式??

我只是根据您的输入做出假设。您可以查看 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

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+)?)

Regex demo | Python demo

说明

  • /begin MEASUREMENT 按字面意思匹配 space
  • ([\w.]+).*\n 捕获第 1 组中的 1+ 个单词字符或一个点并匹配直到字符串末尾。然后匹配一个换行符
  • SWORD ([\w.]+) 匹配 SWORD 并在组 2 中捕获 1+ 次单词字符或点
  • \d+ \d+ 匹配 space, 1+ 位, space, 1+ 位 space
  • (-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?) 在第 3 组和第 4 组中捕获一个可选的减号、1+ 位数字和一个可选的小数部分,中间有一个 space

例如:

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')]