我的正则表达式模式是这样的

<xxxx location="file path/level1/level2" xxxx some="xxx">

我只对分配给位置的引号中的部分感兴趣。如果没有贪婪开关,它不应该像下面这样简单吗?

/.*location="(.*)".*/

似乎并不奏效。


当前回答

import regex
text = 'ask her to call Mary back when she comes back'                           
p = r'(?i)(?s)call(.*?)back'
for match in regex.finditer(p, str(text)):
    print (match.group(1))

输出: 玛丽

其他回答

使用惰性量词?没有全局标志就是答案。

Eg,

如果你有全局flag /g,它会匹配所有最小长度的匹配,如下所示。

Location ="(.*)"将从" after Location ="直到" after some="xxx匹配,除非你让它是非贪婪的。

所以你需要。*?(即通过添加?使其非贪婪),或者更好地将.*替换为[^"]*。

[^"]匹配除" <引号>以外的任何字符 更通用:[^abc] -匹配除a, b或c之外的任何字符

因为您使用的是量化子模式,正如Perl Doc中描述的那样,

默认情况下,量化的子模式是“贪婪的”,也就是说,它会 尽可能多地匹配(给定一个特定的起始位置) 同时仍然允许模式的其余部分匹配。如果你想要的话 要匹配尽可能少的次数,请跟随量词 用"?". 注意,意思没有改变,只是the “贪吃”:

*?        //Match 0 or more times, not greedily (minimum matches)
+?        //Match 1 or more times, not greedily

因此,为了让您的量化模式进行最小匹配,请遵循?:

/location="(.*?)"/

使用非贪婪匹配,如果你的引擎支持的话。加上?捕获内部。

/location="(.*?)"/

如何

.*location="([^"]*)".*

这避免了使用.*进行无限搜索,并将精确匹配第一个引号。