如何使用Python Regex匹配多个行字符串?

问题描述 投票:0回答:3

我有一个以下2行:

/ begin MEASUREMENT ANYNAME1“支持软件模块”

SWORD ANYNAME2 1 100 -Randomdigits1 Randomdigits2

我想匹配ANYNAME1,ANYNAME2,Randomdigits1和Randomdigits2

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

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

但我无法进入第二行。如何匹配第二行的表达式?

python regex multi-select multiline
3个回答
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 =任何空白字符

(?P<>) =创建一组预期输出

\w =任何单词字符

\W =任何非单词字符

\d =任何数字

+ =表达一个或多个


1
投票
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
投票

您可以匹配第一行中捕获组中的ANYNAME1,然后使用.*到达行尾并使用\n匹配新行以到达第二行。在那里,您可以使用3组匹配并捕获您的值。

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

Regex demo | Python demo

说明

  • /begin MEASUREMENT匹配字面上跟着一个空格
  • ([\w.]+).*\n捕获1个单词字符或组1中的点并匹配,直到字符串结束。然后匹配换行符
  • SWORD ([\w.]+)匹配SWORD并在第2组中捕获一个单词char或dot的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')]
© www.soinside.com 2019 - 2024. All rights reserved.