我有一根绳子
txt = 'text1 & ("text2" | "text3" | "text4") & "text5" ! (text6 | text7 | text8)'
假设我想解析它,这样我就得到了括号之间的元素。我的图案看起来像
pattern = '\(([^\)(]+)\)'
使用python,我得到了两个组
>>> print re.findall(pattren, text)
['"text2" | "text3" | "text4"', 'text6 | text7 | text8']
假设我们想找到像
>>> print re.findall(magic_pattren, text )
['& ("text2" | "text3" | "text4")', '! (text6 | text7 | text8)']
任何关于magic_pattren
的猜测。我可以使用字符串操作来获得所需的输出
>>> print [txt[str.find(txt, a)-3: 1+len(a)+str.find(txt, a)] for a in re.findall(pattren, txt)]
['& ("text2" | "text3" | "text4")', '! (text6 | text7 | text8)']
但这感觉有点笨拙,如果括号组是在开始时就失败了。我可以加上一个检查,但就像我说的感觉有点笨重。有人要吗
您可以在模式的开头使用
(?:\B\W\s*)?
可选组:结果sample demo:
['(text9 & text10)', '& ("text2" | "text3" | "text4")', '! (text6 | text7 | text8)']
(?:\B\W\s*)?
是一个非捕获组(因此值不会在结果中输出),可以重复一次或零次(由于最后的?
),并且它只匹配非单词字符(\W
),前提是它前面有一个非单词字符或字符串开头(\B
),后面有0+空格Here is the regex demo
相关问题 更多 >
编程相关推荐