正则表达式匹配单词然后向后看直到另一个单词,然后抓住

时间:2017-03-02 17:28:09

标签: python regex

以下是文字示例:

  

MM是日常休闲装的主打产品。由红色epi制成   这款结构感柔美的手提包采用皮革制成,配有双层平底皮革   手柄,雕刻LV铆钉,微妙徽标,保护性底座和   银色五金配件。它的顶部拉链开口打开到   搭配红色织物衬里内部,配有防滑和拉链口袋   所有日常必需品。

我想抓住内部颜色,所以我正在寻找“内部”,然后从内部向后寻找“a”,两边都有空白。这在Python中使用。

根据我的研究,以下情况应该有效,但是后视不起作用。

(?<!\sa\s).+(?= interior)

这让我:

“MM是日常休闲装的主打产品。采用红色外延皮革制成,这款结构感柔美的手提包采用双扁平皮革手柄,雕刻LV铆钉,精美徽标,保护性底钉和银色五金配件。拉链开合打开一个匹配的红色织物衬里“

而不是我想要的: “匹配红色织物衬里”

2 个答案:

答案 0 :(得分:1)

您可以从a转发点开始搜索。 \ba\b ((?:[^\.](?!\ba\b))*?) interiordemo

取代[^\.]。您可以使用.。我选择了我选择的内容,因为我认为这个匹配不应该扩展到句子,但我可以看到你的文本中可能存在缩写。这是你的选择。如果第一个设置符合您的需要,则正则表达式在从错误匹配开始之前执行较少的搜索。

你的正则表达式没有做你想做的事情的部分原因是它遇到的第一件事MM..肯定会遇到不被a作为前缀的条件。也许你想要一个积极的外观(?<=\sa\s).+(?= interior),但仍然 captures too much 。它可能仍然需要检查语法,就像我的大部分表达式一样,以获得你想要的窄组。

答案 1 :(得分:0)

( a )((?:(?!\1|interior).)*) interior

( a )interior是确定匹配位置的标记,(?:(?!\1|interior).)*匹配除标记之外的任何内容。所需的文本在第2组中捕获。

DEMO