我下面有2行:
/开始测量 ANYNAME1 “UnterstützungskraftSoftwaremodul”
SWORD ANYNAME2 1 100-随机数字1 随机数字2
并且我要匹配 ANYNAME1 , ANYNAME2 , Randomdigits1 和 Randomdigits2
到目前为止,我可以使用以下正则表达式在第一行中匹配 ANYNAME1 :
_regex_struct = re.compile(r'/begin MEASUREMENT (.*)(.*)\n')
但是我无法转到第二行。如何匹配第二行上的表达式?
答案 0 :(得分: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 :(得分: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')
答案 2 :(得分:1)
您可以在第一行中匹配捕获组中的ANYNAME1,然后使用.*
到达该行的末尾,并使用\n
匹配一个新行以到达第二行。在那里,您可以使用3个组来匹配并捕获您的值。
/begin MEASUREMENT ([\w.]+).*\nSWORD ([\w.]+) \d+ \d+ (-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?)
说明
/begin MEASUREMENT
字面匹配,后跟一个空格([\w.]+).*\n
在组1中捕获1个以上的字符或点,然后匹配直到字符串的末尾。然后换行SWORD ([\w.]+)
匹配SWORD并在组2中捕获1个以上字符char或点\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')]