如何使用 Python 正则表达式匹配多行字符串?
How to Match mutilple line string using Python Regex?
我有以下 2 行:
/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul "
SWORD ANYNAME2 1 100 -Randomdigits1 Randomdigits2
我想匹配 ANYNAME1 、 ANYNAME2 、 Randomdigits1 和 Randomdigits2
到目前为止,我可以使用以下正则表达式在第一行中匹配 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+)?)
说明
/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')]
我有以下 2 行:
/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul "
SWORD ANYNAME2 1 100 -Randomdigits1 Randomdigits2
我想匹配 ANYNAME1 、 ANYNAME2 、 Randomdigits1 和 Randomdigits2
到目前为止,我可以使用以下正则表达式在第一行中匹配 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+)?)
说明
/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')]