2016-08-01 46 views
1

我有这样的表达正则表达式 - 为什么这个正则表达式不能在Python中工作?

:([^"]*) \(([^"]*)\) 

,且该文本

:chkpf_uid ("{4astr-hn389-918ks}") 

:"#cert" ("false") 

我试着去满足它,以便在第一句生病让这些群体:

  1. chkpf_uid
  2. { 4astr-hn389-918ks}

,并在第二,病人得到这些:

  1. #cert

我想就避开了引号。

我似乎无法理解为什么我使用的表达式不匹配这些,特别是如果我将[^"]*切换为(.*)

([^"]*)wont match

有(*):does match, but with quotes

这是在使用Python中的re模块2.7

+1

你是正则表达式不匹配引号。由于没有任何东西可以消耗它们,所以正则表达式失败。 –

+0

你不能让正则表达式从一个位置跳转到另一个位置。否定字符类不会像这样。正则表达式顺序匹配一个字符串,如果有引号,你仍然需要匹配它们。匹配你不需要的东西,并匹配*和捕获*你需要的东西。 [':“?([^”] *)“?\(”?([^“] *)”?\)'](https://regex101.com/r/dC4xK2/2) –

+0

每个单个字符应该有自己对应的模式:':“?([^”] *)“?\(”{?(。*?)}?“\)' – revo

回答

1

旁注:您的输入可能需要特定的解析器来处理,特别是如果它可能有转义序列。

回答这个问题本身,请记住,一个正则表达式处理从左至右依次和字符串在这里处理相同。如果模式匹配部分/整个字符串(取决于使用的方法),则返回匹配。

如果字符串中有引号,并且您的模式不匹配这些引号,则匹配将失败,不会返回任何匹配。

一个可能的解决方案可以添加引号为otpional子模式:

:"?([^"]*)"? \("?([^"]*)"?\) 
^^  ^^ ^^  ^^ 

regex demo

你需要捕获到组的部分,报价,存在与否,只是匹配,离开你的re.findall

相关问题