这很简单,但我似乎无法弄清楚。我在这里做什么错了?
在线测试器显示此方法工作正常: https://regex101.com/r/rpUNK9/3
但是当我在Python REPL中尝试它时,我什么也没得到返回:
DeveloperMetadata
答案 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)