2009-08-27 2 views
0

내가 정규식 내가 사용이Python에서 느린 정규식은 무엇입니까?

{@[email protected]} 
{@csm.foo.bar-42} 

의 일치하지 않고 문자열

{@csm.foo.bar} 

이러한 종류의 일치 노력하고있어 그것은 문자열이 경우 느린 개를 가져

r"\{@csm.((?:[a-zA-Z0-9_]+\.?)+)\}" 

입니다 여러 개의 일치 항목이 포함되어 있습니다. 왜?

r"@csm.((?:[a-zA-Z0-9_]+\.?)+)" 

등의 가새 매칭을 제거하면 매우 빠르게 실행되지만, 원하는 것은 아닙니다.

아이디어가 있으십니까? 내가 정확히 정규식 전문가가 아니에요

<dockLayout id="popup" y="0" x="0" width="{@csm.screenWidth}" height="{@csm.screenHeight}"> 
    <dataNumber id="selopacity_Volt" name="selopacity_Volt" value="0" /> 
    <dataNumber id="selopacity_Amp" name="selopacity_Amp" value="0" /> 
    <animate trigger="{@m_ds_ML.VIMPBM_BatteryVoltage.valstr}" triggerOn="*" targetNode="selopacity_Volt" targetAttr="value" to="1" dur="0ms" ease="in" /> 
    <animate trigger="{@m_ds_ML.VIMPBM_BatteryVoltage.valstr}" triggerOn="65024" targetNode="selopacity_Volt" targetAttr="value" to="0" dur="0ms" ease="in" /> 
    <animate trigger="{@m_ds_ML.VIMPBM_BatteryCurrent.valstr}" triggerOn="*" targetNode="selopacity_Amp" targetAttr="value" to="1" dur="0ms" ease="in" /> 
    <animate trigger="{@m_ds_ML.VIMPBM_BatteryCurrent.valstr}" triggerOn="65024" targetNode="selopacity_Amp" targetAttr="value" to="0" dur="0ms" ease="in" /> 
    <dockLayout id="item" width="{@csm.screenWidth}" height="{@csm.screenHeight}" depth="-1" clip="false" xmlns="http://www.tat.se/kastor/kml" > 
    <dockLayout id="list_item_title" x="0" width="{@csm.screenWidth}" height="{@[email protected]_y}"> 
     <text id="volt_amp_text" x="0" ellipsize="false" font="{@csm.listUnselFont}" color="{@csm.itemUnselColor}" dockLayout.halign="left" dockLayout.valign="bottom" string="{ItemTitle}" />    
    </dockLayout>  
    <dockLayout id="gear_layout" y="0" x="0" width="{@csm.screenWidth}" height="{@[email protected]_y}"> 
     <image id="battery_image" x="0" dockLayout.halign="left" dockLayout.valign="bottom" opacity="1" src="{@m_MenuModel.Gauges.VoltAmpereMeter.image}"/> 
    </dockLayout> 
    <!--DockLayout for Voltage Value--> 
    <dockLayout id="volt_value" x="0" width="{@[email protected]_x}" height="{@[email protected]_y}"> 
     <text id="volt_value_text" x="0" opacity="{selopacity_Volt*selopacity_Amp}" ellipsize="false" font="{@csm.listUnselFont}" color="{@csm.itemSelColor}" dockLayout.halign="right" dockLayout.valign="bottom" string="{@m_ds_ML.VIMPBM_BatteryVoltage.valstr}" >  
     </text> 
    </dockLayout> 
    <!--DockLayout for Voltage Unit--> 
    <dockLayout id="volt_unit" x="{@[email protected]_x}" width="{@csm.screenWidth}" height="{@[email protected]_y}"> 
     <text id="volt_unit_text" x="0" opacity="{selopacity_Volt*selopacity_Amp}" ellipsize="false" font="{@csm.listUnselFont}" color="{@csm.itemSelColor}" dockLayout.halign="left" dockLayout.valign="bottom" string="V" >   
     </text> 
    </dockLayout> 
    <!--DockLayout for Ampere Value--> 
    <dockLayout id="ampere_value" x="0" width="{@[email protected]_x}" height="{@[email protected]_y}"> 
     <text id="ampere_value_text" x="0" opacity="{selopacity_Amp*selopacity_Volt}" ellipsize="false" font="{@csm.listUnselFont}" color="{@csm.itemSelColor}" dockLayout.halign="right" dockLayout.valign="bottom" string="{@m_ds_ML.VIMPBM_BatteryCurrent.valstr}" > 
     </text> 
    </dockLayout> 
    <!--DockLayout for Ampere Unit--> 
    <dockLayout id="ampere_unit" x="{@[email protected]_x}" width="{@csm.screenWidth}" height="{@[email protected]_y}"> 
     <text id="ampere_unit_text" x="0" opacity="{selopacity_Amp*selopacity_Volt}" ellipsize="false" font="{@csm.listUnselFont}" color="{@csm.itemSelColor}" dockLayout.halign="left" dockLayout.valign="bottom" string="A" >   
     </text> 
    </dockLayout> 
    <!--DockLayout for containing Data Not Available text--> 
    <dockLayout id="no_data_textline" x="{@[email protected]_x}" width="{@csm.screenWidth}" height="{@[email protected]_y}"> 
     <text id="no_data_text" x="0" opacity="{1-(selopacity_Amp*selopacity_Volt)}" ellipsize="false" font="{@csm.listSelFont}" color="{@csm.itemSelColor}" dockLayout.halign="left" dockLayout.valign="bottom" string="{text1}" >   
     </text> 
    </dockLayout> 
    <!--<rect id="test_rect1" x="{151-28}" y="0" width="1" height="240" opacity="1" fill="#00ff00" /> 
       <rect id="test_rect1" x="{237-28}" y="0" width="1" height="240" opacity="1" fill="#00ff00" /> 
       <rect id="test_rect1" x="{160-28}" y="0" width="1" height="240" opacity="1" fill="#00ff00" /> 
       <rect id="test_rect1" x="{246-28}" y="0" width="1" height="240" opacity="1" fill="#00ff00" /> 
       <rect id="test_rect8" x="0" y="{161-40}" width="320" height="1" opacity="1" fill="#00ff00" /> 
       <rect id="test_rect1" x="{109-28}" y="0" width="1" height="240" opacity="1" fill="#00ff00" />--> 
    </dockLayout> 
</dockLayout> 
+0

자신 만의 템플릿 언어를 만들려고한다면 아마도 잘못된 방법 일 것입니다. –

+0

흠, strange ... timeit은 중괄호가있는 버전과없는 버전 사이에 큰 차이점을 나타내지 않습니다. 테스트 케이스를 줄 수 있습니까? –

+0

템플릿 언어를 사용하지 않고이 형식을 사용하는 일부 구성 파일을 후 처리하려고합니다. –

답변

4

첫 번째 일치 항목이 "개가 느림"인 문자열에 대한 테스트 사례를 제공 할 수 있습니까? BTW, 그것이 성능에 중요한지는 모르겠지만 RE에는 부정확성이 있습니다. {@csm 시작 이후의 모든 문자와 일치합니다. 아마도 더 나은 표현 (아마도 더 빨리 어떤 점을하지 않는 한은 "옵션") 될 수있다 : 당신은 아마 느린 정확히 무엇의 더 나은 예를 줄 필요가

r'\{@csm((?:\.\w+)+)\}' 
+0

더 많은 consise도 –

+0

고쳐! 고맙습니다. –

0

,하지만 인해 경기의 끝에 중괄호로 수 있습니다 : 여기

샘플 입력합니다. r"\{@csm.((?:[a-zA-Z0-9_]+\.?)+)"과 일치하도록 시도하고 닫는 중괄호가 끝에 있는지 여부를 수동으로 확인하십시오.

+0

예, 큰 차이가 있습니다. –

+0

하지만 그때 다시 사용할 수 없습니다. –

0

. 하지와 일치하지 않는 합리적으로 긴 문자열이 포함 물건 :

x="".join(['{@csm.foo.bar-%d}\n{@csm.foo.%dx.baz}\n' % (a,a) 
      for a in xrange(10000)]) 
mymatch=r"\{@csm.((?:[a-zA-Z0-9_]+\.?)+)\}" 

for y in re.finditer(mymatch,x): 
    print y.group(0) 

는 잘 작동하지만 당신은 충분히 긴 문자열을 가지고 당신이 그것을 검색하는 경우 제대로 문제가있을 수 있습니다.