【问题标题】:How to Match mutilple line string using Python Regex?如何使用 Python 正则表达式匹配多行字符串?
【发布时间】:2019-04-09 08:11:34
【问题描述】:

我有以下两行:

/begin MEASUREMENT ANYNAME1 "Unterstützungskraft Softwaremodul"

SWORD ANYNAME2 1 100 -Randomdigits1 Randomdigits2

我想匹配 ANYNAME1ANYNAME2Randomdigits1Randomdigits2

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

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

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

【问题讨论】:

  • 您能否为我们提供更多输入示例?所以我们可以看到模式。 Randomdigits 都是整数吗?
  • 你期望的结果是什么?
  • 它们也可以是浮点数和负数。
  • 我希望 ANYNAME1 、 ANYNAME2 、 Randomdigits1 和 Randomdigits2 在 group(1)、group(2)、group(3)、group(4) 中
  • 你是这个意思吗? regex101.com/r/lbaUpX/1

标签: python regex multi-select multiline


【解决方案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&lt;&gt;) = 创建一组预期输出

\w = 任何单词字符

\W = 任何非单词字符

\d = 任意数字

+ = 表示一个或多个

【讨论】:

  • 你能解释一下你使用的表达方式吗?
  • 谢谢!!当 ANYNAME1 可以有 2 种格式时如何匹配:“ABC.DEF”或“ABCDEF”?
  • 我改变了正则表达式
【解决方案2】:
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')

【讨论】:

    【解决方案3】:

    您可以在第一行匹配捕获组中的 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 组中捕获 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')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-29
      • 2011-11-28
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多