Python Match Regex可在测试仪中使用,但不能在consol中

时间:2019-02-23 00:06:39

标签: python regex

这很简单,但我似乎无法弄清楚。我在这里做什么错了?

在线测试器显示此方法工作正常: https://regex101.com/r/rpUNK9/3

但是当我在Python REPL中尝试它时,我什么也没得到返回:

DeveloperMetadata

1 个答案:

答案 0 :(得分:0)

问题与\n有关。该令牌.*与换行符不匹配,并且每当有新行时它将中断。此代码\n在Python REPL中被解释为换行,但在Regex 101网站中被解释为常规文本。尝试以这种方式思考您的字符串:

<speak><prosody volume=\"x-loud\">This text should match?<break time='500ms'/><mark name='punchline'/>

<say-as interpret-as='interjection'>boing</say-as><break time='1ms'/>!
</prosody></speak>

上面的字符串将与您当前的正则表达式代码不匹配。在此处查看:https://regex101.com/r/rpUNK9/4

要解决此问题,请将.*替换为可以匹配新行的内容,例如[\s\S]*

整个代码将是:

(?<=<speak><prosody volume=\\\"x-loud\\\">)([\s\S]*)(?=<\/prosody>(?:<metadata>|<\/speak>))

示例:https://regex101.com/r/rpUNK9/5

Python代码:

import re
test = """<speak><prosody volume=\"x-loud\">This text should match?<break time='500ms'/><mark name='punchline'/>\n\n<say-as interpret-as='interjection'>boing</say-as><break time='1ms'/>!\n</prosody></speak>"""
rex = '(?<=<speak><prosody volume=\\\"x-loud\\\">)([\s\S]*)(?=<\/prosody>(?:<metadata>|<\/speak>))'
m = re.search(rex,test)