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

2024-09-29 23:28:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面两行:

/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul "

SWORD ANYNAME2 1 100 -Randomdigits1Randomdigits2

我想匹配ANYNAME1ANYNAME2Randomdigits1Randomdigits2

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

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

但我不能上二线。如何匹配第二行的表达式??你知道吗


Tags: re表达式structregexmeasurementbegincompilesword
3条回答

我只是假设一下你的意见。你可以查一下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按字面意思匹配,后跟空格
  • ([\w.]+).*\n捕获1+个单词字符或组1中的一个点,并匹配到字符串的末尾。然后匹配新行
  • SWORD ([\w.]+)匹配剑并在2组中捕获1+次一个单词char或dot
  • \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')]

相关问题 更多 >

    热门问题