首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的慢正则表达式?

Python中的慢正则表达式?
EN

Stack Overflow用户
提问于 2009-08-27 17:34:37
回答 3查看 629关注 0票数 0

我正在尝试匹配这些类型的字符串

代码语言:javascript
复制
{@csm.foo.bar}

而不匹配其中的任何一个

代码语言:javascript
复制
{@csm.foo.bar-@csm.ooga.booga}
{@csm.foo.bar-42}

我使用的正则表达式是

代码语言:javascript
复制
r"\{@csm.((?:[a-zA-Z0-9_]+\.?)+)\}"

如果字符串包含多个匹配项,则会变得很慢。为什么?如果我去掉大括号,它会跑得很快,就像这样

代码语言:javascript
复制
r"@csm.((?:[a-zA-Z0-9_]+\.?)+)"

但这不是我想要的。

有什么想法吗?

以下是示例输入:

代码语言:javascript
复制
<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="{@csm.Gearselection.text_heght-@csm.pageVisualCP_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="{@csm.vmImage_y_gearselection-@csm.pageVisualCP_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="{@csm.VoltAmpereMeter.volt_value_x-@csm.VoltAmpereMeter.List_x}" height="{@csm.vmImage_y_gearselection-@csm.pageVisualCP_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="{@csm.VoltAmpereMeter.volt_unit_x-@csm.VoltAmpereMeter.List_x}" width="{@csm.screenWidth}" height="{@csm.vmImage_y_gearselection-@csm.pageVisualCP_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="{@csm.VoltAmpereMeter.ampere_value_x-@csm.VoltAmpereMeter.List_x}" height="{@csm.vmImage_y_gearselection-@csm.pageVisualCP_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="{@csm.VoltAmpereMeter.ampere_unit_x-@csm.VoltAmpereMeter.List_x}" width="{@csm.screenWidth}" height="{@csm.vmImage_y_gearselection-@csm.pageVisualCP_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="{@csm.VoltAmpereMeter.List_x1-@csm.VoltAmpereMeter.List_x}" width="{@csm.screenWidth}" height="{@csm.vmImage_y_gearselection-@csm.pageVisualCP_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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-08-27 17:49:09

你能提供一个字符串的测试用例,它的第一个匹配是“狗慢”吗?顺便说一句,虽然我不知道这对性能是否重要,但RE中有一个不精确的地方--它匹配{@csm开始之后的任何单个字符,而不仅仅是一个点;也许更好的表达式(可能更快,因为它没有使任何点“可选”)可能是:

代码语言:javascript
复制
r'\{@csm((?:\.\w+)+)\}'
票数 4
EN

Stack Overflow用户

发布于 2009-08-27 17:43:16

我不是一个真正的正则表达式专家,但这可能是由于比赛结束时的支撑。您可以尝试匹配r"\{@csm.((?:[a-zA-Z0-9_]+\.?)+)",然后手动检查末尾是否出现右大括号。

票数 0
EN

Stack Overflow用户

发布于 2009-08-27 18:07:27

你可能需要给出一个更好的例子来说明什么是慢的。对于包含匹配和不匹配的内容的相当长的字符串:

代码语言:javascript
复制
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)

工作得很好,但是如果你有一个足够长的字符串,而你对它的搜索很糟糕,你可能会有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1342589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档