簡體   English   中英

如何使用python regex以任何順序匹配5行文本?

[英]How to match 5 lines of text in any order using python regex?

我正在嘗試編寫一個正則表達式來匹配 XML 中的以下 6 行。

string = '''[<Parameter name="Number of steps" type="unsignedInteger" value="10"/>
        <Parameter name="Type" type="unsignedInteger" value="1"/>
        <Parameter name="Object" type="cn" value="CN=Root,Model=New Model,Vector=Reactions[v1],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value"/>
        <Parameter name="Minimum" type="float" value="216.862"/>
        <Parameter name="Maximum" type="float" value="867.448"/>
        <Parameter name="log" type="bool" value="1"/>]*'''

我需要匹配所有 6 行,但以任何順序,因為編寫它的程序似乎有時會改變哪行去哪里。

我正在嘗試以下代碼:

import re
re.findall('''            <Parameter name="Number of steps" type="unsignedInteger" value="10"/>
        <Parameter name="Type" type="unsignedInteger" value="1"/>
        <Parameter name="Object" type="cn" value="CN=Root,Model=New Model,Vector=Reactions[v1],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value"/>
        <Parameter name="Minimum" type="float" value="216.862"/>
        <Parameter name="Maximum" type="float" value="867.448"/>
        <Parameter name="log" type="bool" value="1"/>''',string)

但它不起作用。 有人知道如何解決我的問題嗎?

- - - - - - 編輯 - - - - - - - - - - - -

更具體地說,我有很多 XMl,我正在閱讀它們作為文本,我需要使用正則表達式提取一些信息。

        scan_parameters=re.findall('''    <Task key="(.*)" name="Scan" type="scan" scheduled="true" updateModel="false">
  <Report reference="(.*)" target="(.*)" append="0" confirmOverwrite="0"/>
  <Problem>
    <Parameter name="Subtask" type="unsignedInteger" value="5"/>
    <ParameterGroup name="ScanItems">
      <ParameterGroup name="ScanItem">
        (<Parameter name="Maximum" type="float" value="(.*)"/>|
        <Parameter name="Minimum" type="float" value="(.*)"/>|
        <Parameter name="Number of steps" type="unsignedInteger" value="10"/>|
        <Parameter name="Object" type="cn" value="CN=Root,Model=(.*),Vector=Reactions\[(.*)\],ParameterGroup=Parameters,Parameter=(.*),Reference=Value"/>|
        <Parameter name="Type" type="unsignedInteger" value="1"/>|
        <Parameter name="log" type="bool" value="1"/>){6}
      </ParameterGroup>
    </ParameterGroup>''',copasiML_original)

我需要它來返回一個包含 (.*) 中的值的列表。

如果您確實需要使用正則表達式執行這些操作,則可以使用積極展望,如下所示:

(?=.*\[<Parameter name="Number of steps" type="unsignedInteger" value="10"/>)(?=.*<Parameter name="Type" type="unsignedInteger" value="1"/>)(?=.*<Parameter name="Object" type="cn" value="CN=Root,Model=New Model,Vector=Reactions\[v1\],ParameterGroup=Parameters,Parameter=Kcat,Reference=Value"/>)(?=.*<Parameter name="Minimum" type="float" value="216.862"/>)(?=.*<Parameter name="Maximum" type="float" value="867.448"/>)(?=.*<Parameter name="log" type="bool" value="1"/>\]\*)

但是,請注意,如果每個語句之間有任何換行符,則這將不匹配。 如果它們之間有換行符,請將(?=.*替換為(?=[.\\s]*否則您可以在將換行符傳遞到匹配之前刪除換行符

調試器演示

如果您不在乎它們是重復的還是有一些缺失——只要有五個連續匹配:

/(text1|text2|text3|text4|text5){5}/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM